c++ - <'variable/function'的多重定义 >

标签 c++ unix compiler-errors

我正在尝试使用candidate.h文件、candidate.cpp文件和main.cpp文件编写一个基本程序

我在 Candidate.h 文件中声明了一个 void readCandidates() 函数。

然后我在 Candidate.cpp 中将其定义为

void readCandidates ()
{
  cin >> nCandidates;
  string line;
  getline (cin, line);

  for (int i = 0; i < nCandidates; ++i)
    {
      getline (cin, candidateNames[i]);
      delegatesWon[i] = 0;
    }
}

变量nCandidates、candidateNames[]和delegatesWon[]也都在candidate.h中声明。

我也有

#ifndef CANDIDATE_H
#def CANDIDATE_H
...
#endif 

在我的 Candidate.h 文件中,以确保它不会被定义两次。

当我运行命令 make main 时出现错误

/home/pmurray/cs250/Asst1/primaries.cpp:33: multiple definition of `candidate'
candidates.o:/home/pmurray/cs250/Asst1/candidates.cpp:8: first defined here
primaries.o: In function `assignDelegatesToCandidates()':
/home/pmurray/cs250/Asst1/primaries.cpp:37: multiple definition of `nCandidates'
candidates.o:/home/pmurray/cs250/Asst1/candidates.cpp:15: first defined here
primaries.o: In function `assignDelegatesToCandidates()':
/home/pmurray/cs250/Asst1/primaries.cpp:38: multiple definition of `delegatesWon'
candidates.o:/home/pmurray/cs250/Asst1/candidates.cpp:16: first defined here
candidates.o: In function `readCandidates()':

我尝试将 extern 放在其中一个变量的声明之前,这导致了错误

candidates.cpp:(.text+0x49): undefined reference to `candidateNames'
primaries.o: In function `findCandidate(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)':
primaries.cpp:(.text+0x120): undefined reference to `candidateNames'
primaries.o: In function `printCandidateReport(int)':
primaries.cpp:(.text+0x1d8): undefined reference to `candidateNames' 

有人知道我做错了什么吗?

候选人.cpp

#include <iostream>

using namespace std;
#include "candidates.h"

void readCandidates ()
{
  cin >> nCandidates;
  string line;
  getline (cin, line);

  for (int i = 0; i < nCandidates; ++i)
    {
      getline (cin, candidateNames[i]);
      delegatesWon[i] = 0;
    }
}

候选人.h

#ifndef CANDIDATES_H
#define CANDIDATES_H

#include <iostream>
#include <string>

using namespace std;

// Max # of candidates permitted by this program
extern const int maxCandidates = 10;

// Names of the candidates participating in this state's primary
extern string candidate[maxCandidates];

// Names of all candidates participating in the national election
extern std::string candidateNames[maxCandidates];

// How many candidates in the national election?
extern int nCandidates;

// How many delgates have been won by each candidate
extern int delegatesWon[maxCandidates];

extern int findCandidate (std::string name);


/**
 * read the list of candidate names, initializing their delegate counts to 0.
 */
void readCandidates ();

#endif // CANDIDATES_H

primaries.cpp(这是我的main.cpp)

#include <iostream>
//#include "candidates.cpp"

using namespace std;

#include "candidates.h"

// How many delegates are assigned to the state being processed
int delegatesForThisState;

// How many candidates in the primary for the state being processed
int nCandidatesInPrimary;

// How many states participate in the election
int nStates;

// How many delegates in the election (over all states)
int totalDelegates = 0;

// How many votes were cast in the primary for this state
int totalVotes;

// How many votes wone by each candiate in this state's primary
int votesForCandidate[maxCandidates];


/**
 * For the most recently read primary, determine how many delegates have
 * been won by each candidate.
 */
int assignDelegatesToCandidates ()
{
  int remainingDelegates = delegatesForThisState;
  for (int i = 0; i < nCandidatesInPrimary; ++i)
    {
      int candidateNum = findCandidate(candidate[i]);
      int nDel = (delegatesForThisState * votesForCandidate[i] + (totalVotes-1)) / totalVotes;
      if (nDel > remainingDelegates)
    nDel = remainingDelegates;
      delegatesWon[candidateNum] += nDel;
      remainingDelegates -= nDel;
    }
}



/**
 * Find the candidate with the indicated name. Returns the array index
 * for the candidate if found, nCandidates if it cannot be found.
 */
int findCandidate (std::string name)
{
  int result = nCandidates;
  for (int i = 0; i < nCandidates && result == nCandidates; ++i)
    if (candidateNames[i] == name)
      result = i;
  return result;
}


/**
 * Print the report line for the indicated candidate
 */
int printCandidateReport (int candidateNum)
{
  int requiredToWin = (2 * totalDelegates + 2) / 3; // Note: the +2 rounds up
  if (delegatesWon[candidateNum] >= requiredToWin)
    cout << "* ";
  else
    cout << "  ";
  cout << delegatesWon[candidateNum] << " " << candidateNames[candidateNum] << endl;
}



/**
 * read the info on one state's primaries
 */
void readState ()
{
  totalVotes = 0;
  cin >> nCandidatesInPrimary >> delegatesForThisState;
  totalDelegates += delegatesForThisState;  // "x += y" is a shorthand for "x = x + y"
  string word, line;
  getline (cin, line);
  for (int i = 0; i < nCandidatesInPrimary; ++i)
    {
      cin >> votesForCandidate[i];
      totalVotes = totalVotes + votesForCandidate[i];

      cin >> word;
      getline (cin, line);
      candidate[i] = word + line;
    }
}



/**
 * Generate the report on the national primary election.
 */
int main(int argc, char** argv)
{
  readCandidates();
  int nStates;
  cin >> nStates;
  for (int i = 0; i < nStates; ++i)
    {
      readState();
      assignDelegatesToCandidates();
    }
  for (int i = 0; i < nCandidates; ++i)
    {
      printCandidateReport(i);
    }
  return 0;
}

最佳答案

你在头文件中声明变量和函数extern,你仍然需要在某个地方定义它们,最好在你使用它们的.cpp文件中(在你的情况下,candidates.cpp)。

将您在函数中使用的所有变量的定义添加到您的 candidates.cpp 文件中,这将解决您的问题。

顺便说一句,同意这不是一个好的编程形式,但这可能超出了这个问题的范围。您不需要全局变量,因为不需要在实现文件 (.cpp) 之外访问它们。

关于c++ - <'variable/function'的多重定义 >,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7327821/

相关文章:

java - 创建同一个类的实例时,出现类的 noClassDefFoundError 错误。为什么会这样?

C++ 错误 : Invalid conversion from 'char' to 'const char*'

c++ - 在使用包含冒号的类函数宏时,是什么导致编译器出现这种差异?

尝试从结构打印时出现编译器错误

unix - Emacs 无法保存自定义 - 初始化文件未完全加载

linux - `exec n<&0 < file` 和 `exec n<file` 命令之间的区别以及有关 exec 命令的一些一般问题

java - Java接口(interface)的问题

c++ - 基于用户输入的运行时函数规范

c++ - 限定名称和使用声明的 clang 错误消息

linux - 如何获取我的 linux 系统以前的主机名?