2015-03-22 3 views
0

Я до сих пор довольно новичок в C++, поэтому, пожалуйста, позвольте! По существу я создал структуру в файле заголовка для одного из моих классов, заполненных строками.Использование структуры между классами в C++

typedef struct details{ 
     string name; 
     string address; 
}details; 

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

private: 
vector <details> foo; 

Я также хочу использовать структуры в главном

details d; 
d.name = "hi"; 
d.address = "hello"; 

однако, когда я в настоящее время пытаются сделать это, я получаю ошибки, такие как

error: 'details' was not declared in this scope 
    vector <details> foo; 

и

error: template argument 1 is invalid 
    vector <details> foo; 

у кого-то было похоже суды, которые могут обеспечить, что я могу сделать, чтобы исправить это? Большое спасибо.

EDIT ПОКАЗАТЬ КОД

Class1.h

#include "class2.h" 

struct trans1{ 
    string name; 
}; 
class class1 { 

private: 
    vector <trans2> t2; 

public: 
    class1(); 
}; 

class2.h

#include "class1.h" 

struct trans2{ 
    string type; 
}; 

class class2{ 

private: 
    vector <trans1> t1; 

public: 
    class2(); 
}; 

ErrorLog:

In file included from class1.h:3:0, 
       from class1.cpp:1: 
class2.h:21:13: error: 'trans1' was not declared in this scope 
    vector <trans1> t1; 
      ^
class2.h:21:19: error: template argument 1 is invalid 
    vector <trans1> t1; 
       ^
class2.h:21:19: error: template argument 2 is invalid 

I понимаете, что это смешной код в реальном мире, но это самый простой способ продемонстрировать.

+3

Вы должны включить этот заголовок в каждом модуле, CPP, который относится к структуре. –

+1

Пожалуйста, предоставьте SSCCE. – Shoe

+0

Ive добавил код выше – Will

ответ

1

Вы должны включить заголовочный файл, содержащий определение struct всюду, где вы его используете.

Единственные случаи, когда вам не нужно, - это когда вы только объявляете ссылки или указатели на него; в этом случае вы можете просто вперед объявить его:

struct details; 

Также в C++, можно просто объявить его:

struct details{ 
    std::string name; 
    std::string address; 
}; 

Там действительно нет необходимости в typedef.

+0

Я включил каждый заголовочный файл в каждом классе. – Will

+0

Форвардное объявление не работает для случая OP. –

+0

@ πάνταῥεῖ> Единственные случаи, когда вам не нужно, - это когда вы только объявляете ссылки или указатели на него; в этом случае вы можете просто отправить объявление – Shoe

0

Определение структуры в C++ выглядит

#include <string> 

struct details{ 
    std::string name; 
    std::string address; 
}; 

и должны рассматриваться, прежде чем она используется в другом месте в коде.Предполагается, вы разместили объявление сверху в файле заголовка details.hpp, вы должны иметь следующее использовать его

#include <vector> 
#include "details.hpp" 

// Some context 

std::vector<details> vdetails; 

В некоторых ситуациях, когда details элементы этой структуры на самом деле не доступны, вы можете также использовать опережающее объявление как

struct details; 

, а не в том числе полное объявление структуры. Тогда это можно использовать, чтобы объявить details* указатели или details& ссылки в дальнейших объявлениях, так как до сих пор с ними ничего не разыменовывается.

0

details.h

#include <string> 

#ifndef DETAILS_H 
#define DETAILS_H 

struct details { 
    std::string name; 
    std::string address; 
}; 

#endif 

details.cpp

#include "details.h" 
//insert implementation here 

other_header.cpp

#include "details.h" 
#include <vector> 

std::vector<details> main_use; 
//whatever else here 

Это должно работать.

EDIT

Если вы хотите использовать его в другом классе:

my_class.h

#include "details.h" 
#include <vector> 

#ifndef MYCLASS_H 
#define MYCLASS_H 

class myClass { 
std::vector<details> class_use; 
//insert stuff here 

}; 

#endif 

EDIT 2

Я очень не уверен, почему вы определяете в структурах классы, как вы, - это путаница. Вот как я буду делать, если. Обратите внимание: #ifndef ... #define ... #endif шаблон очень важен. Это также плохая идея включить заголовки, которые включают себя. Я хотел бы организовать свой код (как есть) следующим образом:

trans.h

#ifndef TRANS_H 
#define TRANS_H 

#include <string> 
struct trans1 { 
    std::string name; 
}; 

struct trans2 { 
    std::string type; 
}; 

#endif 

class1.h

#ifndef CLASS1_H 
#define CLASS1_H 

#include "trans.h" 
#include <vector> 

class Class1 { 
    public: 
    Class1(); 
    private: 
    std::vector<trans2> t2; 
}; 

#endif 

class2.h

#ifndef CLASS2_H 
#define CLASS2_H 

#include "trans.h" 
#include <vector> 

class Class2 { 
    public: 
    Class2(); 
    private: 
    std::vector<trans1> t1; 
}; 

#endif 

Теперь так, как это организовано, вы можете использовать trans-структуру по #include "trans.h" 'ing в основном, наряду с устранением круговой включает. Надеюсь, это помогло.

Вы найдете, что main.cc ниже компилируется без ошибок.

main.cc

#include<iostream> 
#include "class1.h" 
#include "class2.h" 
#include "trans.h" 

int main() 
{ 
    std::cout << "Hello, World!" << std::endl; 

    return 0; 

} 

erip

+0

Я включил файлы заголовков, но получил другую ошибку: В файле, входящем в класс.h: 3: 0, library.h: 22: 13: error: «newClass» не был объявлен в этой области vector нКл; – Will

+0

Так же ошибка, но на этот раз с классом. Я включил все заголовки в каждый класс. Я не уверен, где я ошибаюсь. – Will

+0

Вы сказали, что вам нужен вектор структур, а не вектор классов. Я смущен. – erip

Смежные вопросы