C++;辅助函数的多重定义 编辑:回答的问题是,由于函数具有相同的签名,尽管它们在单独的文件中,但是C++看到了两个版本并混淆了。>/P>

C++;辅助函数的多重定义 编辑:回答的问题是,由于函数具有相同的签名,尽管它们在单独的文件中,但是C++看到了两个版本并混淆了。>/P>,c++,multiple-definition-error,C++,Multiple Definition Error,我有三个类:Table和Bed都继承自Furniture Table和Bed都有一个助手函数GetLowerCase(std::string)分别在每个类中定义。当运行make时(Makefile如下所示),我得到一个错误,指出Bed.cpp中的GetLowerCase首先是在Table.cpp中定义的 生成文件: main: main.o Furniture.o Table.o Bed.o g++ main.o Furniture.o Table.o Bed.o -o main

我有三个类:
Table
Bed
都继承自
Furniture

Table
Bed
都有一个助手函数
GetLowerCase(std::string)
分别在每个类中定义。当运行
make
时(Makefile如下所示),我得到一个错误,指出
Bed.cpp
中的
GetLowerCase
首先是在
Table.cpp
中定义的

生成文件:

main: main.o Furniture.o Table.o Bed.o
        g++ main.o Furniture.o Table.o Bed.o -o main

main.o: main.cpp
        g++ -c main.cpp

Furniture.o: Furniture.cpp Furniture.h
        g++ -c Furniture.cpp

Table.o: Furniture.cpp Table.cpp Table.h
        g++ -c Table.cpp

Bed.o: Furniture.cpp Bed.cpp Bed.h
        g++ -c Bed.cpp

clean:
        rm *.o main
表1.cpp:

#include "Table.h"
#include <iostream>
#include <string>

std::string GetLowerCase(std::string str)
{
        std::string out;
        for (int i=0; i<str.length(); i++)
        {
                out[i] = tolower(str[i]);
        }
        return out;
}

Table::Table(const std::string n, std::string wt) : Furniture(n)
{
        wood_type = GetLowerCase(wt);
        if (wood_type != "pine" && wood_type != "oak")
        {
                std::cerr << "Wood type must be OAK or PINE.";
        }
}

void Table::Print()
{
        Furniture::Print();
        std::cout << "Wood Type: " << wood_type << std::endl;
}
#包括“Table.h”
#包括
#包括
std::string GetLowerCase(std::string str)
{
std::字符串输出;

对于(int i=0;i可以声明函数
static
或将其包装在匿名命名空间中:

namespace {
    // duplicated names here.
}
您的选择:

>p>将所有帮助函数转换为帮助类(如<代码> COMMOUTILS >)作为代码> static < /COD>成员函数。我推荐这种方式,它更为C++,并且可以避免重复代码。

  • 将函数声明为
    静态
    。这样它的作用域将位于定义它的文件中,而不是全局

  • 使用名称空间扭曲函数

  • 只定义一次函数,在要使用它的文件中,使用
    extern std::string GetLowerCase(std::string str)
    声明它,然后可以调用它


  • 在整个程序中,只能有一个具有特定签名的函数,这样做是为了能够在一个文件中定义函数并在另一个文件中使用。如果您不希望某些函数在特定文件外可见,请参阅疯狂的Eddie的答案。如果您希望,则不应该有其他具有相同签名的函数,即al从外部可见。关于makefile:您的对象文件不应该依赖于其他对象文件。对象文件取决于获取该对象文件所需的内容,即源文件和头;编译器在链接阶段之前不会查看其他对象文件。顺便说一句,我发现您的助手函数在这两个文件中是相同的。我建议est使用
    util.h
    标题将其移动到一个单独的
    util.cpp
    单元。@是的,谢谢,我解决了这个问题。现在正在处理生成文件!编辑了这个问题以反映我现在的情况,但我仍然遇到一个问题。我建议避免编辑这个问题,因为它现在完全不同了。第二个问题是不能将
    -c
    键传递到
    gcc
    链接阶段,
    -c
    表示“仅编译”。
    namespace {
        // duplicated names here.
    }