2013-12-14 1 views
0

Я получаю следующее сообщение об ошибке при попытке компиляции:C++ Получение «символы не найден», что я не знаком с

Undefined symbols for architecture x86_64: 
    "DivSales::corpSales", referenced from: 
     DivSales::CalculateDivTotal()  in cc8xj4HM.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 

Любой совет будет весьма признателен. Это моя первая попытка перегрузить оператора, так что я чувствую, что проблема там есть.

Кроме того, если есть лучший способ добиться того, что я делаю, с оператором switch, а также функциями setter, установленными DivSales, сначала установите setSecond и т. Д. Мне бы очень хотелось услышать о них. Еще раз спасибо. Вот весь код:

#include <iostream> 
#include <string> 
using namespace std; 


class DivSales{ 
    private: 
     double quarter[4]; // Holds the sales for each quarter 
     double first, second, third, fourth; // Store values from the inputs 
     static double corpSales; // Shared among all instances of DivSales (each object) 

    public: 
     // Populate the array quarter 
     void setQuartersArr(double first, double second, double third, double fourth){ 
      quarter[0] = first; 
      quarter[1] = second; 
      quarter[2] = third; 
      quarter[3] = fourth; 
     } 

     void setFirst (double fir){ 
      first = fir; 
     } 

     void setSecond (double sec){ 
      second = sec; 
     } 

     void setThird (double thi){ 
      third = thi; 
     } 

     void setFourth (double fou){ 
      fourth = fou; 
     } 

     // Returns the sales of a particular quarter 
     double getSales(int quar){ 
      double quarSales; 
      quarSales = quarter[quar]; 
      return quarSales; 

     } 

     double CalculateDivTotal(){ 
      double total = 0; 
      for(int count = 0; count < 4; count++) total += quarter[count]; 
      corpSales += total; 
      return corpSales; 
     } 

     friend ostream &operator<<(ostream &out, DivSales divi6){ 
      out << divi6.CalculateDivTotal(); 
      return out; 
     } 

}; 


int main() 
{ 
    int divNum = 6; 
    int quartCount = 1; 
    double tempSales; 
    DivSales divi1, divi2, divi3, divi4, divi5, divi6; 
    DivSales divisions[6] = {divi1, divi2, divi3, 
          divi4, divi5, divi6}; 

    cout << "Welcome, please enter "; 
    for(int count = 0; count < divNum; quartCount++){ 
     cout << "Division " << count + 1 << ", Quarter " 
      << quartCount << " sales: "; 
     switch (quartCount){ 
      case 1: cin >> tempSales; 
        divisions[count].setFirst(tempSales); 
        break; 
      case 2: cin >> tempSales; 
        divisions[count].setSecond(tempSales); 
        break; 
      case 3: cin >> tempSales; 
        divisions[count].setThird(tempSales); 
        break; 
      case 4: cin >> tempSales; 
        divisions[count].setFourth(tempSales); 
        count++; 
        quartCount = 0; 
        break; 
     } 
     tempSales = 0; 
    } 

    // Run the CalculateDivTotal method for each object except the last one 
    for(int count = 0; count < 5; count++) divisions[count].CalculateDivTotal(); 


    cout << divi6.CalculateDivTotal(); 

    return 0; 
} 
+0

Это не похоже на то, что вы определили и инициализировали 'double DivSales :: corpSales;' где угодно, откуда приходит неопределенный ref. – greatwolf

ответ

3

Статически объявленные переменные-члены класса должны быть определены в файле C++.

Добавление double DivSales::corpSales = 0; под класс исправляет ошибку.

+0

Большое спасибо! Как насчет функций 'switch' и member? Я чувствую, что в моем коде слишком много повторений. –

+0

Не совсем по теме, но проверьте [этот смысл] (https://gist.github.com/argiopetech/7955782). Первичное изменение перемещает «cin» из коммутатора. Обычно я не предлагаю тривиальные сеттеры, поэтому я их удалю. Я бы сделал 'setQuarter (int, double)', чтобы разрешить доступ с проверкой ошибок. –

+0

Я пошел вперед и добавил второй файл, который использует мой предложенный 'setQuarter'. Надеюсь, это полезно. –

Смежные вопросы