2012-03-22 3 views
2

Редактировать: я уменьшил большинство ошибок с префиксом std:: на объявлениях строк. Однако, похоже, существует проблема с несколькими функциями, в частности определениями тех функций, у которых в качестве параметра есть строка.Скомпилировать ошибки со связанными файлами в C++

Редактировать # 2: Обновлен мой код (у меня есть std:: префикс в моих объявлениях функций, но не отразил его в моем сообщении). Пожалуйста, см. Самую нижнюю часть ошибок, отображаемых при добавлении префикса std:: к строковым параметрам в проблемных функциях.


У меня есть файл заголовка movie.h со следующим кодом (соответствующий код):

#include <string> 

class Movie 
{ 
    public: 

     void addMovieName(std::string movie); 
     void addLastName(std::string nameLast); 
     void addFirstName(std::string nameFirst); 

    private: 

     string movieName, 
       directorLastName, 
       directorFirstName, 
       directorFullName; 
}; 

и файл реализации movie.cpp как этот (соответствующий код):

#include "movie.h" 

// addFirstName, addLastName, and addMovie name all do the same things 
// so I'm only including one since they all generate the same error 

void Movie::addFirstName(string nameFirst) 
{ 
    directorFirstName = nameFirst.resize(10, ' '); 
} 

Upon компиляции , Я получаю следующие ошибки:

g++ -c movie.cpp -o movie.o 
movie.cpp:225: error: variable or field ‘addFirstName’ declared void 
movie.cpp:225: error: ‘int Movie::addFirstName’ is not a static member of ‘class Movie’ 
movie.cpp:225: error: ‘string’ was not declared in this scope 
movie.cpp:226: error: expected ‘,’ or ‘;’ before ‘{’ token 
movie.cpp:240: error: variable or field ‘addLastName’ declared void 
movie.cpp:240: error: ‘int Movie::addLastName’ is not a static member of ‘class Movie’ 
movie.cpp:240: error: ‘string’ was not declared in this scope 
movie.cpp:241: error: expected ‘,’ or ‘;’ before ‘{’ token 
movie.cpp:255: error: variable or field ‘addMovieName’ declared void 
movie.cpp:255: error: ‘int Movie::addMovieName’ is not a static member of ‘class Movie’ 
movie.cpp:255: error: ‘string’ was not declared in this scope 
movie.cpp:256: error: expected ‘,’ or ‘;’ before ‘{’ token 
make: *** [movie.o] Error 1 

Некоторые из тех, кто сказал, что мне нужно добавить std:: к строковым параметрам в определениях функций.

При этом:

// adding std:: prefix 
void Movie::addFirstName(std::string nameFirst) 
{ 
    directorFirstName = nameFirst.resize(10, ' '); 
} 

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

g++ -c movie.cpp -o movie.o 
movie.cpp: In member function ‘void Movie::addFirstName(std::string)’: 
movie.cpp:227: error: no match for ‘operator=’ in ‘((Movie*)this)->Movie::directorFirstName = nameFirst.std::basic_string<_CharT, _Traits, _Alloc>::resize [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](10u, 32)’ 
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:485: note: candidates are: std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>] 
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:493: note:     std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>] 
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/basic_string.h:504: note:     std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>] 
movie.cpp: At global scope: 
movie.cpp:240: error: variable or field ‘addLastName’ declared void 
movie.cpp:240: error: ‘int Movie::addLastName’ is not a static member of ‘class Movie’ 
movie.cpp:240: error: ‘string’ was not declared in this scope 
movie.cpp:241: error: expected ‘,’ or ‘;’ before ‘{’ token 
movie.cpp:255: error: variable or field ‘addMovieName’ declared void 
movie.cpp:255: error: ‘int Movie::addMovieName’ is not a static member of ‘class Movie’ 
movie.cpp:255: error: ‘string’ was not declared in this scope 
movie.cpp:256: error: expected ‘,’ or ‘;’ before ‘{’ token 
make: *** [movie.o] Error 1 
+0

Какая ошибка возникает при использовании std :: string? Кроме того, откройте , чтобы узнать, как объявлена ​​строка. Иногда «string» является псевдонимом basic_string <> в зависимости от того, какой пакет STL вы используете. –

+0

вам нужно 'using namespace std;', чувак. –

+0

Как вы изучаете C++? Это очень простые принципы, которые вам не хватает. –

ответ

0

Никто еще не ответил на этот вопрос, поэтому я решил, что просто поставлю его здесь, так как я понял это. В основном, моим решением было:

Использовать using std::string в файлах заголовка и реализации.


Во-вторых, заявление:

stringOne = stringTwo.resize(some_number, ' ');

... терпит неудачу, потому что resize() пустота возвращения функции. Замена этого двумя отдельными операторами; а именно:

stringOne = stringTwo; 
stringOne.resize(/* blah */); 

... решает остальную часть ошибок. Приобретите @Jesse за упоминание об этом в комментариях.

2

Вы не указали правильное пространство имен для строки, строка является членом пространства имен std. В этом случае вам нужно написать std :: string, так как я не вижу «using namespace std;» в вашем коде.

заменить:

string movieName, 
     directorLastName, 
     directorFirstName, 
     directorFullName; 

с:

std::string movieName, 
      directorLastName, 
      directorFirstName, 
      directorFullName; 
+0

Это было действительно одно серьезное решение. Я редактировал свой пост, когда писал это. – skippr

+0

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

0

Почему все ваши частные поля указатели? Хранение равнины int s и float s как поля отлично в порядке. Кроме того, вам не нужно «инициализировать» строки в вашем конструкторе. Если вы этого не сделаете, их конструкторы по умолчанию будут вызваны автоматически (string s будет пустым). И почему вы набиваете строки? Даже если вам это нужно при отображении, проложите их там.

+1

Вы, кажется, много пропустите и имеете проблемы (или будете) со многими другими вещами. Просто хотел указать на то, что неправильно в вашем коде (даже если они работают .. на данный момент). – Rev

+0

Это задание в колледже. Операторы 'clear()' должны «очищать любые остаточные данные из атрибутов строкового типа» и были требованием лаборатории. Динамически распределенные переменные более подходят для практики, а не для необходимости.Изменение размера зависит от функциональных критериев, определенных в лабораторных спецификациях. – skippr

+0

@sunday: Мне тоже интересно, почему вы используете указатели и динамическое распределение памяти для простых переменных 'int' и' float'. Ручное управление ресурсами, как это необычно и подвержено ошибкам. Знаете ли вы о [Правиле трех] (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three)? – Blastfurnace

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