C ++辅助函数的多重定义

时间:2017-02-09 01:37:05

标签: c++ multiple-definition-error

编辑:已回答 - 问题在于,因为函数具有相同的签名,尽管它们位于不同的文件中,但C ++看到了两个版本并且感到困惑。

我有三个班级:TableBed都来自Furniture

TableBed各自在每个类中分别定义了辅助函数GetLowerCase(std::string)。运行make时(下面显示的Makefile),我收到一条错误消息,指出GetLowerCase中的Bed.cpp首先在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

Table.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;
}

Bed.cpp:

#include "Bed.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;
}

Bed::Bed(const std::string n, std::string sz) : Furniture(n)
{
        size = GetLowerCase(sz);
        if (size != "twin" && size != "full" && size != "queen" && size != "king")
        {
                std::cerr << "Bed size must be TWIN, FULL, QUEEN, or KING.";
        }
}

void Bed::Print()
{
        Furniture::Print();
        std::cout << "Size: " << size << std::endl;
}

我原以为GetLowerCase将完全包含在其定义的.cpp文件中,并且不会被任何其他文件“看到”。

除了上面列出的两个文件之外,它不在任何标题或源文件中。非常困惑,并希望得到一些帮助!

2 个答案:

答案 0 :(得分:2)

声明你的函数static或将它包装在匿名命名空间中:

namespace {
    // duplicated names here.
}

答案 1 :(得分:0)

您的选择:

  1. 将所有辅助函数移动到辅助类(如CommomUtils)作为static成员函数。我推荐这种方式,它是更多的C ++,你可以避免重复的代码。

  2. 将您的函数声明为static。所以它的范围将在文件中定义它,而不是全局。

  3. 使用命名空间扭曲您的函数。

  4. 仅定义一次您的函数,并在文件中使用它,使用extern std::string GetLowerCase(std::string str)进行声明,然后您可以调用它。