2013-07-23 2 views
3

EDITнет подходящих функции для вызова конструктора (с ++)

Хорошо, я сделал немного чтения снова в течение нескольких часов, и я думаю, что я, наконец, понять, с ++ ООП немного лучше (по крайней мере, основы). Я решил переписать всю программу и немного поработать и проверить больше. Я думаю, что я сузил ошибки, которые я больше на этот раз.

NamedStorm.h

#include <string> 
#include <iostream> 

#ifndef NAMEDSTORM_H_INCLUDED 
#define NAMEDSTORM_H_INCLUDED 

// NEVER use using namespce in header, use std instead. 

class NamedStorm{ 
private: 
    std::string stormName; 
    std::string stormCategory; 
    double maxWindSpeed; 
    double stormPressure; 
    static int stormCount; 
public: 

    // Constructor 
    NamedStorm(std::string, double, std::string, double); 
    NamedStorm(std::string); 

    // Destructor 
    ~NamedStorm(); 

    // Get functions 
    int getStormCount(); 
    double getStormPressure(); 
    double getWindSpeed(); 
    std::string getStormCategory(); 
    std::string getName(); 

    // Set functions 
    static void displayOutput(); 
    static void sortByNames(); 
    static void sortByWindSpeed(); 
    static void getAverageWindSpeed(); 
    static void getAverageStormPressure(); 
}; 

#endif // NAMEDSTORM_H_INCLUDED 

NamedStorm.cpp

// CPP => Function definition 
#include <string> 

#include "NamedStorm.h" 

using namespace std; 

// Defining static variables 
int NamedStorm::stormCount = 0; 

// Constructor definition 
NamedStorm::NamedStorm(std::string sName, double wSpeed, std::string sCat, double sPress){ 
    stormName = sName; 
    windSpeed = wSpeed; 
    stormCategory = sCat; 
    stormPressure = sPress; 
    stormCount++; 
} 

NamedStorm::NamedStorm(std::string sName){ 
    stormName = sName; 
    stormCount++; 
} 

// Destructor definition 
NamedStorm::~NamedStorm(){} 

// Get (Accessor) function definition 
int NamedStorm::getStormCount(){ 
    return stormCount; 
} 

double NamedStorm::getStormPressure(){ 
    return stormPressure; 
} 

string NamedStorm::getStormCategory(){ 
    return stormCategory; 
} 

string NamedStorm::getName(){ 
    return stormName; 
} 

// Set (Mutator) function definition 
void NamedStorm::displayOutput(){} 
void NamedStorm::sortByNames(){} 
void NamedStorm::getAverageStormPressure(){} 
void NamedStorm::getAverageWindSpeed(){} 
void NamedStorm::getWindSpeed(){} 

main.cpp

#include <iostream> 
#include <string> 

#include "NamedStorm.h" 

using namespace std; 

NamedStorm storm[5]; // Error occurs here 

int main(){ 
    // NamedStorm Chris("Chris", 70.0, "T.S", 990.0); 
    // storm[0] = Chris; 
    return 0; 
} 
+2

Этот 'NamedStorm() {};' является не только объявлением, но и определением. Опечатка? – dyp

+4

Один из ваших конструкторов определяется дважды, один не на всех, и, пожалуйста, ** никогда не используйте 'using namespace blah;' в заголовке. – chris

+0

Что вы используете для его запуска - убедитесь, что ваши файлы связаны правильно и в правильном порядке. @DyP, возможно, по какой-то причине ему нужен пустой конструктор по умолчанию. Но да, это определено дважды. –

ответ

4

1. Удалите определение конструктора

В файле заголовка (NamedStorm.h) вы имеете определен конструктор по умолчанию NamedStorm:

NamedStorm(){}; 

Но то, что вы действительно хотели просто конструктор декларация:

NamedStorm(); 

Разница между определением ition и declare - это то, что декларация сообщает компилятору, что есть некоторая функция (например, конструктор NamedStorm), тогда как определение предоставляет полный объем этой функции.

Обратите внимание, что если вы укажете только декларацию для своей функции и забудьте сделать определение, вы получите ошибку компоновщика undefined reference.

Дальнейшее чтение: http://www.cprogramming.com/declare_vs_define.html

2. Исправьте второй конструктор

NamedStorm::NamedStorm(string sName, double wSpeed, string sName, double sPress) 

Это не может работать, потому что вы пытаетесь передать два аргумента с тем же именем. Я думаю, вы хотели назвать второй sCat, так как вы используете такую ​​переменную в определении конструктора. Правильный вариант:

NamedStorm::NamedStorm(string sName, double wSpeed, string sCat, double sPress) 

3. Оператор < <

Если вы читали первую часть, то вы должны знать, что случилось с operator<< сейчас. Вы предоставили только объявление , а не определение.

Вы можете заполнить это следующим образом:

std::ostream& operator<<(ostream& out, NamedStorm& namedStorm) 
{ 
    out << namedStorm.getName(); 
    return out; 
} 

Обратите внимание, что декларация также изменилась - функция теперь занимает NamedStorm& вместо const NamedStorm&, так как метод getName не объявлен как const. Вы можете прочитать около const методов here.

4. Определить статические переменные CLAs

Каждая статическая переменная объявляется в классе (только int stormCount в вашем случае) должны быть определены. Поместите эту строку в ваш файлNamedStorm.cpp:

int NamedStorm::stormCount = 0; 

После применения этих изменений ваш код должен работать нормально. Тем не менее, есть еще много языковых нюансов, которые вы могли бы прочитать о том, чтобы улучшить свой код. Некоторые из них являются: аргументы функции

1. Попутных в качестве значений по сравнению константных ссылок

Хорошо прочитать здесь: Is it better in C++ to pass by value or pass by constant reference?

2. Функцию, возвращающую объект копии против константных ссылок

Этих вопрос также имеет хороший ответ на SO: Is it more efficient to return a const reference

3. Будьте осторожны с «использованием имен»

Опять же, SO: Why is "using namespace std" considered bad practice?

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

+0

+1 Полезно, но неполно. «Аксессоры», принимающие параметр «NamedStorm param []», все еще содержат ошибки и/или подвержены ошибкам (при условии, что размер массива равен 5). – dyp

+0

Я решил начать весь код снова, ваши решения помогают A LOT, но у меня все же есть ошибки, которые мне нужно исправить. –

+0

@ Tee-Man: не могли бы вы уточнить? Не должно быть ошибок компилятора/компоновщика, если вы выполнили указанные выше шаги. – podkova

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