Оператор присваивания класса = вопрос - PullRequest
1 голос
/ 06 сентября 2011

Скажем, у меня есть два класса в двух разных заголовках, которые называются:

class TestA
{
    public:
        int A;
};

class TestB
{
    public:
        int B;
};

И я хочу дать им оба оператора присваивания друг другу, так что это выглядит так:

class TestB; //Prototype of B is insufficient to avoid error with A's assignment

class TestA
{
    public:
        int A;
        const TestA &operator=(const TestB& Copy){A = Copy.B; return *this;} 
};

class TestB
{
    public:
        int B;
        const TestB &operator=(const TestA& Copy){B = Copy.A; return *this;}
};

Как мне сделать вышеупомянутое, избегая очевидной ошибки, которая возникнет в результате вызова / использования класса TestB, когда он еще не определен?

Ответы [ 2 ]

6 голосов
/ 06 сентября 2011

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

Чтобы решить, отправьте объявление классов и поместите их реализацию в отдельные файлы.

A Заголовочный файл:

// A.h

// forward declaration of B, you can now have
// pointers or references to B in this header file
class B;

class A
{
public:
    A& operator=(const B& b);
};

A sфайл реализации:

// A.cpp
#include "A.h"
#include "B.h"

A& A::operator=(const B& b)
{
   // implementation...
   return *this;
}

Следуйте той же базовой структуре и для B.

1 голос
/ 06 сентября 2011

Если вы включите оба заголовочных файла в ваш .cpp файл, он должен работать.Убедитесь, что у вас есть полное определение обоих классов в заголовочных файлах.

...