这里首先定义C ++多重定义

时间:2015-07-08 19:30:19

标签: c++

我正在输入一个来自Absolute C ++的示例程序,它不断给我这个错误:

f

我已将程序简化为纯粹的基础知识,但我仍然无法弄清楚发生了什么。有人可以帮忙吗?

生成文件:

/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::HashTable()':
hashtableimp.cpp:(.text+0x0): multiple definition of `HashTableSavitch::HashTable::HashTable()'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x0): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::HashTable()':
hashtableimp.cpp:(.text+0x0): multiple definition of `HashTableSavitch::HashTable::HashTable()'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x0): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::~HashTable()':
hashtableimp.cpp:(.text+0x16): multiple definition of `HashTableSavitch::HashTable::~HashTable()'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x16): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::~HashTable()':
hashtableimp.cpp:(.text+0x16): multiple definition of `HashTableSavitch::HashTable::~HashTable()'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x16): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::~HashTable()':
hashtableimp.cpp:(.text+0x44): multiple definition of `HashTableSavitch::HashTable::~HashTable()'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x44): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::computeHash(std::string)':
hashtableimp.cpp:(.text+0x6a): multiple definition of `HashTableSavitch::HashTable::computeHash(std::string)'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x6a): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::containsString(std::string) const':
hashtableimp.cpp:(.text+0x7a): multiple definition of `HashTableSavitch::HashTable::containsString(std::string) const'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x7a): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::put(std::string)':
hashtableimp.cpp:(.text+0x8e): multiple definition of `HashTableSavitch::HashTable::put(std::string)'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x8e): first defined here
collect2: error: ld returned 1 exit status
Makefile:2: recipe for target 'hashTable' failed
make: *** [hashTable] Error 1

hashtable.h

hashTable: listtools.h listtools.cpp hashtable.h hashtable.cpp hashtableimp.cpp 
    g++ listtools.h listtools.cpp hashtable.h hashtable.cpp hashtableimp.cpp -o hashTable

hashtable.cpp

#ifndef HASHTABLE_H
#define HASHTABLE_H

#include <string>
#include "listtools.h"

using LinkedListSavitch::Node;
using std::string;

namespace HashTableSavitch {
    const int SIZE = 10;
    class HashTable {
    public:
        HashTable();
        virtual ~HashTable();
        bool containsString(string target) const;
        void put(string s);
    private:
        Node<string> *hashArray[SIZE];
        static int computeHash(string s);
    };
}

#endif

hashtableimp.cpp

#include <string>
#include "listtools.h"
#include "hashtable.h"

using LinkedListSavitch::Node;
using LinkedListSavitch::search;
using LinkedListSavitch::headInsert;
using std::string;

namespace HashTableSavitch {
    HashTable::HashTable() {

    }

    HashTable::~HashTable() {

    }

    int HashTable::computeHash(string s) {
        return 0;
    }
    bool HashTable::containsString(string target) const {
        return true;
    }

    void HashTable::put(string s) {

    }
} // HashTableSavitch

listtools.h

#include <string>
#include <iostream>
#include "hashtable.h"
#include "listtools.cpp"
#include "hashtable.cpp"
using std::string;
using std::cout;
using std::endl;
using HashTableSavitch::HashTable;

int main() {
    HashTable h;
    cout << "Adding cat, dog, turtle, and bird" << endl;
    h.put("cat");
    h.put("dog");
    h.put("turtle");
    h.put("bird");

    cout << "Contains cat? " << h.containsString("cat") << endl;
    cout << "Contains dog? " << h.containsString("dog") << endl;
    cout << "Contains turtle? " << h.containsString("turtle") << endl;
    cout << "Contains bird? " << h.containsString("bird") << endl;
    cout << "Contains cow? " << h.containsString("cow") << endl;
    cout << "Contains fish? " << h.containsString("fish") << endl;

    return 0;
}

1 个答案:

答案 0 :(得分:9)

如果要在#include命令行上列出它们,则不应hashtableimp.cpp cpp进入主g++

实际上你有两个选择:

  • 将您的代码全部包含在一个文件中(或将代码分成几个文件,将#include分成另一个文件,这样它实际上就是一个文件) - 在这种情况下你需要在g++命令行
  • 中仅列出此主文件
  • 将代码真正拆分为多个文件 - 然后在g++命令行中列出所有这些文件,但不需要将带有定义(通常为cpp)的#include个文件放入其他文件中。

原因是One Definition Rule:任何函数(有一些例外)都应该在整个程序的一个地方定义。如果你#include一个人进入其他人,然后编译所有这些,你重复定义。

通常前者用于小型程序,后者用于较大型项目。更常见的是,在后一种方法中,您通常会逐个编译每个文件,然后将它们链接在一起。

另请注意,您通常不需要在命令行中列出.h个文件,它们不应该由自己编译,而只需要#include d到其他.cpp}文件,以便编译器知道在那里使用的函数/对象/等的声明。