2016-05-23 3 views
0

Можно ли переслать объявление класса, а затем использовать его функции-члены? Я пытаюсь сделать это:Как я могу переслать объявление класса и использовать его функции-члены позже в C++?

class Second; 

class First{ 
private: 
    int x=0; 
public: 
    void move(Second* s,int i){ 
    s->setLine(i); 
    s->called(true); 
    } 
    int getX(){return x;} 
} 

class Second{ 
private: 
int line=2; 
bool cal=false; 
public: 
void setLine(int l){line = l;} 
void called(bool b){cal=b} 
bool interact(First* f){ 
    if ((f->getX())>3) 
    return true; 
    else 
    return false; 
} 
} 

Моя актуальная проблема является немного более сложным и funcions делать больше вещей, но то, что я пытаюсь сделать, это эти два класса используют Афоризм funcions и они взаимодействуют в этом путь. Кто-нибудь знает, есть ли способ сделать это?

+7

Отделить их в заголовке и реализации файлов – ArchbishopOfBanterbury

+0

Я пробовал, но компилятор выдал сообщение об ошибке «упреждающее объявление класса второго», так что я подумал, что если бы они были вместе, это не было бы проблемой – helpme

+0

@helpme Проверьте HTTP: //stackoverflow.com/questions/625799/resolve-header-include-circular-dependencies-in-c –

ответ

1

Вы можете поместить определение First::move вне класса, после определения Second. В определении First должно появиться только объявление.

Вы действительно можете поместить определение First::move в .cpp-файл, а не в любой заголовок.

+0

Я просто сделал это с заголовочными файлами, объявляющими функции там, но тогда, когда я делаю файлы cpp и определяю их, я все равно получаю ошибка компилятора. Это потому, что оба класса используют функции друг от друга? – helpme

+0

Возможно, нет; скорее всего, будет отсутствовать. Но не видя кода, я не могу сказать. –

+0

Да, мне не хватало извинения. Спасибо за вашу помощь! – helpme

3

Можно ли переслать объявление класса, а затем использовать его функции-члены?

Нет, это не так. Вы не можете получить доступ к любому члену объявленного вперед класса, переменных, функций, перечислений, вложенных типов и т. Д. До тех пор, пока не будет определен класс.

Вам необходимо переместить реализацию функции, которая вызывает функцию-член объявленного класса после определения объявленного класса.

class Second; 

class First{ 
    private: 
     int x=0; 
    public: 
     void move(Second* s,int i); // Don't define it here. 
     int getX(){return x;} 
}; 

class Second{ 

    ... 

}; 

// Define the function now. 
void First::move(Second* s,int i){ 
    s->setLine(i); 
    s->called(true); 
} 
+0

Да, спасибо, я разделил все на файлы заголовков и cpp, чтобы сначала объявить функции, а затем определить их, и теперь это работает. Спасибо за помощь! – helpme

1

Следующее будет делать трюк для вас, но лучше отделить декларацию и реализацию.

class Second; 

class First{ 
private: 
    int x=0; 
public: 
    void move(Second* s,int i); //<- move implementation after Second's declaration 
    int getX(){return x;} 
} 

class Second{ 
private: 
int line=2; 
bool cal=false; 
public: 
void setLine(int l){line = l;} 
void called(bool b){cal=b} 
bool interact(First* f){ 
    if ((f->getX())>3) 
    return true; 
    else 
    return false; 
} 
}; 

void First::move(Second* s,int i){ 
s->setLine(i); 
s->called(true); 
} 
+0

спасибо за помощь. Я разделил декларацию и реализацию, как было предложено, и теперь это работает! – helpme