我有 3 个课程:扫描仪、表格、阅读器。Scanner 将信息添加到 Table 中,Reader 从 table 中读取。那么,我应该在哪里声明 Table 变量?我在.h中做过,但是有双重包括的错误。
问问题
99 次
3 回答
1
“双重包含错误”向我表明,一个文件被多次包含在一个翻译单元中。例如,假设您有:
表.h
#include "reader.h"
class Table
{
Reader* mReader;
};
读者.h
#include "table.h"
class Reader
{
};
主文件
#include "table.h"
#include "reader.h"
int main()
{
Table table;
}
main.cpp
编译时,table.h
将包含“reader.h”,其中将table.h
无限包含 , 等等。
至少有两种方法可以解决这个问题。
在大多数情况下可能首选的第一种方法是在您不需要完整定义的情况下前向声明您的类。例如,Table
有一个指向 的指针Reader
,并且不需要完整的定义:
新表.h
class Reader;
class Table
{
Reader* mReader;
};
明智地使用前向声明有助于加快编译速度,也许更重要的是,减少循环依赖。
第二种方法是使用包含守卫:
新表.h
#ifndef TABLE_H
#define TABLE_H
#include "reader.h"
class Table
{
Reader* mReader;
};
在所有头文件中使用包含保护可能不是一个坏主意,无论您是否使用前向声明,但我建议尽可能使用前向声明。
于 2013-05-20T15:05:41.973 回答
-1
听起来你有多重定义的问题。在每个页眉的顶部使用,并将每个 C++ 类包含在页眉和页脚中。
#pragma once
class Name {}
//or
#ifndef __CLASS_NAME_H__
#define __CLASS_NAME_H__
class Name { }
#endif
IE
//Scanner.h
#pragma once //<---------- must use it so you do not have double include..
class Table; //forward decalre reduced dependendcy and no need to include h.
class Scanner {
int ReadIntoTable(Table* pInTable);
}
//Scanner.cpp
// has method bodies that uses Table like
#include "Table.h"
int Scanner::ReadIntoTable(Table* pInTable)
{
pInTable->putData(123);
return void.
}
//Table.h
#pragma once //<-------- use so you do not have double include.
class Table {
getData();
putData(int Data);
}
//Table.cpp
// impelenation for table
于 2013-05-20T14:56:13.273 回答
-1
可能是这样的:
// Scanner.h
#ifndef _Scanner_h_ // guard: ensure only one definition
#define _Scanner_h_
#include "Table.h"
class Scanner
{
....
void add(Table & table); // implemented in Scanner.cpp
};
#endif
// Reader.h
#ifndef _Reader_h_
#define _Reader_h_
#include "Table.h"
class Reader
{
...
void read(const Table & table); // implemented in Reader.cpp
};
#endif
// Table.h
#ifndef _Table_h_
#define _Table_h_
class Table
{
...
};
#endif
主要:
#include "Table.h"
#include "Scanner.h"
#include "Reader.h"
....
int main(int argc, char **argv)
{
Table table;
Scanner scanner;
Reader reader
scanner.add(table);
....
reader.read(table);
....
}
于 2013-05-20T14:55:27.077 回答