两个类与一个一起工作(C ++)

时间:2013-05-20 14:49:00

标签: c++

我有3个类:扫描仪,表格,阅读器。 Scanner向Table添加信息,Reader从表中读取。那么,我应该在哪里声明Table变量?我在.h做过,但是有双重错误包括。

3 个答案:

答案 0 :(得分:1)

“双重包含错误”向我暗示,单个翻译单元中不止一次包含单个文件。例如,假设你有:

table.h

#include "reader.h"

class Table
{
  Reader* mReader;
};

reader.h

#include "table.h"
class Reader
{
};

的main.cpp

#include "table.h"
#include "reader.h"

int main()
{
  Table table;
}

编译main.cpp后,table.h将包含'reader.h',其中包括table.h等无限广告。

至少有两种方法可以解决这个问题。

在大多数情况下,可能首选的第一种方法是在您不需要完整定义的情况下向前声明您的类。例如,Table有一个指向Reader的指针,不需要完整的定义:

新table.h

class Reader;
class Table
{
  Reader* mReader;
};

明智地使用前向声明有助于加快编译速度,或许更重要的是,可以减少循环依赖性。

第二种方法是使用包含警戒:

新table.h

#ifndef TABLE_H
#define TABLE_H

#include "reader.h"

class Table
{
  Reader* mReader;
};

在所有头文件中使用包含保护可能不是一个坏主意,无论你是否使用前向声明,但我建议尽可能使用前向声明。

答案 1 :(得分:-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);
    ....
}

答案 2 :(得分:-1)

听起来你有多重定义的问题。 在每个标题的顶部使用,并在页眉和页脚中包含每个C ++类。

#pragma once
class Name {}
//or
#ifndef __CLASS_NAME_H__
#define __CLASS_NAME_H__
class Name { }
#endif

//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