Классы в C++

Модератор: Модераторы разделов

Ответить
RedLynx
Сообщения: 4

Классы в C++

Сообщение RedLynx »

Доброго времени суток!
У меня есть небольшая проблема- объявил 3 класса (A,B,C) и в классах B,C сделал ссылки на класс A:

Код:

class A { public: int prop[100]; int funct(); } class B { private: A *clA; public: B (A cl); //constructor ~B(); //destructor void setProp(); } B::B(A cl){ clA=&cl; } //constructor void B::setProp(){ for (int i=0;i<100;i++){ clA->prop[i]=i; } } . . . A classA; B classB(classA);


Класс C по реализации похож на B. Проблема в том, что после вызова метода setProp класса classB массив prop в classA не изменяется. Как решить эту проблему?
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current
Контактная информация:

Re: Классы в C++

Сообщение drBatty »

RedLynx писал(а):
14.12.2007 11:08
B::B(A cl){
clA=&cl;
} //constructor


RedLynx писал(а):
14.12.2007 11:08
B classB(classA);
Здесь вы создаёте временный безымянный объект с типом A, и уже с ним работаете, а вам нужно работать с самим classA. Для этого измените конструктор на B::B(A &cl) или на B::B(A *cl), тогда в конструктор B::B будет передаваться ссылка или указатель на classA, а не его временная копия.
PS: Что-бы таких ошибок не было в будущем скройте конструктор копирования и оператор присваивания вот так:

Код: Выделить всё

class A {
private:
 A(const A &t) {}
 const A &operator=(const A &t) {return *this;}
public:
 int prop[100];
 int funct();
}

Если после этого вы опять так ошибётесь(или не вы, а другой кодер использующей ваш класс), то компилятор просто не даст собрать этот код.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux
Контактная информация:

Re: Классы в C++

Сообщение deninok »

Лучше передай конструктору класса В указатель на А. Например, так:

Код: Выделить всё

#include <iostream>
using namespace std;

class A {
public:
    int prop[100];
        // ...
};

class B {
private:
    A* clA;
public:
    B (A* cl) {
        clA = cl;
    }
    ~B() {}
    void setProp() {
        for ( int i = 0; i < 100; i++ ) {
            clA->prop[i] = i;
        }
    }
};

int main() {
    A a;
    A* ap = &a;
    B b( ap );
    b.setProp();

// Проверяем значения в массиве
    for ( int i = 0; i < 100; i++ ) {
        cout << "a.prop[] = " << a.prop[i] << endl;
    }

    return 0;
}


P.S. И кстати, после закрывающей фигурной скобки определения класса точку с запятой ставить все же нужно...
Спасибо сказали:
RedLynx
Сообщения: 4

Re: Классы в C++

Сообщение RedLynx »

:rolleyes:
CПАСИБО ВСЕМ)))
Спасибо сказали:
Ответить