2014-02-05 3 views
1

Я новичок в C++, и я экспериментировал с последовательной сериализацией, и мне хотелось узнать, работает ли он, когда класс объявлен как член другого класса. Но когда я компилирую свой код, я получаю множество ошибок. Я пробовал объявлять основы как структуру, но никаких изменений в ошибках. Мой код:Я получаю сообщение об ошибке, когда объявляю класс членом другого класса. ошибка: ключ класса должен использоваться при объявлении друга

#include <iostream> 
#include <fstream> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/archive/text_oarchive.hpp> 

class baseds{}; 
class superior{}; 

class baseds { 
private: 
    friend class boost::serialization::access; 
public: 
    int a; 
    int b; 
    int c; 
    baseds(){} 
    ~baseds(){} 
    template <class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & a; 
     ar & b; 
     ar & c; 
    } 
}; 

class superior { 
private: 
    friend class boost::serialization::access; 
public: 
    int x; 
    int y; 
    baseds lag; 
    superior(){} 
    ~superior(){} 
    template <class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & x; 
     ar & y; 
     ar & lag; 
    } 
}; 

int main() { 

    superior myData,myData2; 
    myData.x=10; 
    myData.y=20; 
    myData.lag.a=1; 
    myData.lag.b=2; 
    myData.lag.c=3; 

    ofstream ofs("steps.txt"); 
    { 
     boost::serialization::archive one(ofs); 
     one << myData; 
    } 

    ifstream ifs("steps.txt"); 
    { 
     boost::serialization::archive two(ifs); 
     two >> myData2; 
    } 
    std::cout<<"\n"<<myData2.x; 
    std::cout<<"\n"<<myData2.y; 
    std::cout<<"\n"<<myData2.lag.a; 
    std::cout<<"\n"<<myData2.lag.b; 
    std::cout<<"\n"<<myData2.lag.c; 

    return 0; 

} 

ошибки:

tier2.cpp:10: error: a class-key must be used when declaring a friend 
tier2.cpp:29: error: a class-key must be used when declaring a friend 
tier2.cpp:32: error: expected `;' before "int" 
tier2.cpp: In member function `void superior::serialize(Archive&, unsigned int)': 
tier2.cpp:38: error: `x' undeclared (first use this function) 
tier2.cpp:38: error: (Each undeclared identifier is reported only once for each function it appears in.) 
tier2.cpp:39: error: `y' undeclared (first use this function) 
tier2.cpp:40: error: `lag' undeclared (first use this function) 
tier2.cpp: In function `int main()': 
tier2.cpp:47: error: 'class superior' has no member named 'x' 
tier2.cpp:48: error: 'class superior' has no member named 'y' 
tier2.cpp:49: error: 'class superior' has no member named 'lag' 
tier2.cpp:50: error: 'class superior' has no member named 'lag' 
tier2.cpp:51: error: 'class superior' has no member named 'lag' 
tier2.cpp:53: error: `ofstream' undeclared (first use this function) 
tier2.cpp:53: error: expected `;' before "ofs" 
tier2.cpp:55: error: `archive' is not a member of `boost::serialization' 
tier2.cpp:55: error: expected `;' before "one" 
tier2.cpp:56: error: `one' undeclared (first use this function) 
tier2.cpp:57: error: expected `;' before '}' token 
tier2.cpp:59: error: `ifstream' undeclared (first use this function) 
tier2.cpp:59: error: expected `;' before "ifs" 
tier2.cpp:61: error: `archive' is not a member of `boost::serialization' 
tier2.cpp:61: error: expected `;' before "ones" 
tier2.cpp:62: error: `ones' undeclared (first use this function) 
tier2.cpp:63: error: expected `;' before '}' token 
tier2.cpp:64: error: 'class superior' has no member named 'x' 
tier2.cpp:65: error: 'class superior' has no member named 'y' 
tier2.cpp:66: error: 'class superior' has no member named 'lag' 
tier2.cpp:67: error: 'class superior' has no member named 'lag' 
tier2.cpp:68: error: 'class superior' has no member named 'lag' 
tier2.cpp:71:2: warning: no newline at end of file 
+0

Я ничего о сериализации не знаю. Почему у вас есть классы на основе {}; class superior {}; до фактического определения класса? – sajas

+1

Чтобы расширить комментарий sajas, 'class baseds;' является объявлением класса, 'class baseds {};' является определением. Технически вы переопределяете 'baseds' и' superior'. – Adam

ответ

1

Вы переопределения как baseds и superior. Вы должны получить ошибку, аналогичную

class baseds{}; // definition 
class superior{}; // definition 

// second definition 
class baseds { 
private: 
.... 

error: redefinition of 'class baseds'

Удалите первую пару определений.

+2

Или превратите их в объявления, удалив только фигурные скобки. –

+0

@SebastianRedl Не было бы смысла иметь эти объявления, хотя :) – juanchopanza

+0

Не в этом примере, но они могут быть необходимы в исходном коде. Или они могут быть предпочтением стиля; Я видел кодовые базы, где файл начинается с объявлений классов, которые он определяет (например, MFC). –

1

Вы определяете baseds и superior дважды.

На НКУ вы получите соответствующее сообщение об ошибке:

main.cpp:9:7: error: redefinition of 'baseds' 
class baseds { 
    ^
main.cpp:6:7: note: previous definition is here 
class baseds{}; 
    ^
main.cpp:27:7: error: redefinition of 'superior' 
class superior { 
    ^
main.cpp:7:7: note: previous definition is here 
class superior{}; 

Казалось бы ваш компилятор не распознает переопределение и теряется, производя плохое сообщение об ошибке.

Если вы имели в виду, чтобы обеспечить опережающее объявление обоих классов, вы должны потерять фигурные скобки:

class baseds; 
class superior; 

class baseds { 
    /* ... */ 
}; 

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

0

К сожалению Fellow StackOverflow граждан, это был глупый вопрос, понял, большинство ошибок после хорошего сна правильный код, как показано ниже:

#include <iostream> 
#include <fstream> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/archive/text_oarchive.hpp> 

class baseds; 
class superior; 

class baseds { 
private: 
    friend class boost::serialization::access; 
public: 
    int a; 
    int b; 
    int c; 
    baseds(){} 
    ~baseds(){} 
    template <class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & a; 
     ar & b; 
     ar & c; 
    } 
}; 

class superior { 
private: 
    friend class boost::serialization::access; 
    friend class baseds; 
public: 
    int x; 
    int y; 
    baseds lag; 
    superior(){} 
    ~superior(){} 
    template <class Archive> 
    void serialize(Archive & ar, const unsigned int version) 
    { 
     ar & x; 
     ar & y; 
     ar & lag; 
    } 
}; 

int main() { 

    superior myData,myData2; 
    myData.x=10; 
    myData.y=20; 
    myData.lag.a=1; 
    myData.lag.b=2; 
    myData.lag.c=3; 

    std::ofstream ofs("steps.txt"); 
    { 
     boost::archive::text_oarchive one(ofs); 
     one << myData; 
    } 

    std::ifstream ifs("steps.txt"); 
    { 
     boost::archive::text_iarchive two(ifs); 
     two >> myData2; 
    } 
    std::cout<<"\n"<<myData2.x; 
    std::cout<<"\n"<<myData2.y; 
    std::cout<<"\n"<<myData2.lag.a; 
    std::cout<<"\n"<<myData2.lag.b; 
    std::cout<<"\n"<<myData2.lag.c; 

    return 0; 

}