2016-12-06 2 views
-3

Я не очень хорошо разбираюсь в структурах. Но я создал это:C++ struct в заголовочном файле

в test.h:

class test { 
public: 
    struct Astruct 
    { 
     int age; 
     int weight; 
    }; 
    struct Astruct& MethodOne(); 
}; 

и test.cpp:

#include "test.h" 
test::test() {} 
struct Astruct& test::MethodOne() { 
    Astruct testStruct; 
    // code to fill in testStruct 
    return testStruct; 
} 

Цель этого выше кода является то, что я в состоянии возвращать struct с MethodOne.

Но на линии

struct Astruct & test::MethodOne(){ 

он говорит: Ошибка: заявление несовместимо с тем, что в файле заголовка.

Я этого не понимаю. Если бы я заменил struct на возвращаемый тип int, не было бы ошибки? Что здесь не так?

И вторая ошибка я получаю, когда я вернусь testStruct: Ошибка: ссылка типа «Astruct &» (не сопз квалифицирован) не может быть инициализирован со значением типа «тест :: Astruct»

+3

Классический один: вы возвращаете ссылку на временный. Научитесь компилировать свой код с включенным предупреждением и следовать инструкциям компилятора. – YSC

+2

Ваше использование 'struct' выглядит так, как вы узнали его из книги C. В C++ вам нужно только знать, что нет никакой разницы между 'class' и' struct'. И второе, что вам нужно знать, это то, что в 'классе' спецификатор доступа по умолчанию является' private', тогда как в 'struct' он является' public', но на самом деле это единственная разница – user463035818

+2

'struct test :: Astruct & test :: MethodOne() {', используйте пространство имен классов. Кстати, третья ошибка, которую вы получите, это «возвращение ссылки временного». Снимите ссылку в возвращаемом значении. –

ответ

3

У вашего кода несколько ошибок (отсутствует ; и т. Д.). A class не отличается от struct в C++. Единственным отличием является спецификатор доступа по умолчанию, который равен private в class и public в struct (участники и наследование).

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

class Foo{ 
    public: 
    struct BarIn {};    // need ; here 
    struct BarOut {};    // and here 
    BarOut bar(const BarIn& b){return BarOut();} 
}; 


int main() { 
    Foo::BarOut result = Foo().bar(Foo::BarIn()); 
} 

Обратите внимание, что я должен был написать Foo:BarOut и Foo::BarIn, потому что Структуры объявляются внутри класса. Также нет необходимости писать struct, когда вы объявляете переменную типа, объявленной как struct (потому что действительно нет разницы между экземпляром class или struct).

И последнее, но не в последнюю очередь вы должны никогда возвращает ссылку (или указатель) на локальную переменную:

struct Astruct & test::MethodOne(){ 
    Astruct testStruct; 
    return testStruct;   // testStruct is destroyed here 
}         // and the returned ref is invalid