«Объект» не был объявлен ошибкой - PullRequest
1 голос
/ 21 октября 2011

Я новичок в c ++, пришедшем из Java, поэтому я не уверен, что я делаю не так, здесь следующая строка в person.h дает мне ошибку Transaction has not been declared.

void pay(Transaction transaction);

У меня есть объект Transaction, я должен объявить / включить его в файл person.h где-нибудь?

вот мой person.h источник

#ifndef PERSON_H_
#define PERSON_H_

#include "Transaction.h"

using std::string;

class Person {
public:

    class Transaction;

    Person();
    virtual ~Person();
    void pay(Transaction* transaction);
};

#endif /* PERSON_H_ */

Ответы [ 6 ]

4 голосов
/ 21 октября 2011

В C ++ отделение объявлений от определений - большая вещь. Объявления рассказывают, как использовать код, и находятся в заголовочных (.h) файлах. Определения являются самим кодом и находятся в исходных (.cpp) файлах.

Если файл ссылается на Transaction только по указателю или по ссылке (как обычно в заголовке), то вам нужно только предварительно объявить класс транзакции с class Transaction;. Если для файла требуется фактическое значение транзакции, тогда вам нужно #include "Transaction.h".

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

3 голосов
/ 21 октября 2011

Когда вы объявляете класс внутри другого класса, вы объявляете внутренний класс.

Итак

class Person {
public:

    class Transaction;
};

Объявляется класс, полное имя которого - Person :: Transaction.Даже если в глобальной области видимости существует другой класс с именем Transaction, предполагается, что ссылки на Transaction ссылаются на Person :: Transaction.Так как вы не определили этот класс, вы получите свою ошибку.

То, что вы хотите: :: Transaction, либо от включения заголовка, либо от объявления вперед за пределами объявления класса.Сделайте либо

class Transaction;
class Person {
};

ИЛИ

#include "Transaction.h"
class Person
{
};

Первый способ позволяет передавать только по ссылке.Передача по значению или вызов функции требует полного определения класса, предоставленного include.

2 голосов
/ 21 октября 2011

Я могу придумать (как минимум) две возможные причины этого:

  • Вы уверены, что предварительное объявление Transaction должно быть в Person?Это означает, что Transaction является вложенным классом в Person.
  • Включают ли заголовочные файлы один другой, то есть существует ли циклическая зависимость?
1 голос
/ 21 октября 2011

Вы должны включить заголовочный файл, в котором определена транзакция (если бы вы использовали указатель, вы могли бы просто объявить класс Transaction в вашем h-файле и включить Transaction.h только в файл реализации).

0 голосов
/ 21 октября 2011

Спасибо за публикацию кода.Попробуйте:

  1. В файле person.h вверху укажите: class Transaction
  2. В файле person.cpp вверху укажите: #include "Transaction.h"

Надеюсь, это поможет

0 голосов
/ 21 октября 2011

#include "Transaction.h" в верхней части вашего файла должен сделать трюк.

...