【发布时间】:2016-01-29 06:42:51
【问题描述】:
我在 Debian 8.2 Jessie 上使用 g++。
我正在学习 C++ 中的类。我想我了解基础知识,但不完全了解如何使用头文件实例化类对象。
这里是Movie.h:
#ifndef MOVIE_H
#define MOVIE_H
#include <string>
#include <iostream>
class Movie
{
private:
std::string m_title;
int m_releaseYear;
std::string m_description;
public:
Movie(std::string &title, int releaseYear, std::string &description);
~Movie()
{
std::cout << "\nDestructor called\n";
}
void setMovieInfo(std::string &title, int releaseYear, std::string &description);
std::string getTitle();
int getReleaseYear();
std::string getDescription();
void printInfo();
};
#endif
然后是Movie.cpp:
#include "Movie.h"
// Movie constructor
Movie::Movie(std::string &title, int releaseYear, std::string &description)
{
setMovieInfo(std::string &title, int releaseYear, std::string &description);
}
// Movie mem function
void Movie::setMovieInfo(const std::string &title, const int releaseYear, const std::string &description)
{
m_title= title;
m_releaseYear= releaseYear;
m_description= description;
}
std::string Movie::getTitle()
{
return m_title;
}
int Movie::getReleaseYear()
{
return m_releaseYear;
}
std::string Movie::getDescription()
{
return m_description;
}
void Movie::printInfo()
{
std::cout << "Title: " << m_title << '\n';
std::cout << "Year: " << m_releaseYear << '\n';
std::cout << "Description" << m_description << '\n';
}
还有main.cpp:
#include "Movie.h"
int main(){
std::string title;
int releaseYear;
std::string description;
title= "Blade Runner";
releaseYear= 1982;
description= "Harrison Ford's character hunts a group of runaway four-year-olds.";
Movie bladeRunner(title, releaseYear, description);
bladeRunner.printInfo();
return 0;
}
我跑了g++ -Wall Movie.cpp main.cpp -o main.sh && ./main.sh,但得到了这个输出:
Movie.cpp: In constructor ‘Movie::Movie(std::string&, int, std::string&)’:
Movie.cpp:6:27: error: expected primary-expression before ‘&’ token
setMovieInfo(std::string &title, int releaseYear, std::string &description);
^
Movie.cpp:6:35: error: expected primary-expression before ‘int’
setMovieInfo(std::string &title, int releaseYear, std::string &description);
^
Movie.cpp:6:64: error: expected primary-expression before ‘&’ token
setMovieInfo(std::string &title, int releaseYear, std::string &description);
^
Movie.cpp: At global scope:
Movie.cpp:10:6: error: prototype for ‘void Movie::setMovieInfo(const string&, int, const string&)’ does not match any in class ‘Movie’
void Movie::setMovieInfo(const std::string &title, const int releaseYear, const std::string &description)
^
In file included from Movie.cpp:1:0:
Movie.h:20:8: error: candidate is: void Movie::setMovieInfo(std::string&, int, std::string&)
void setMovieInfo(std::string &title, int releaseYear, std::string &description);
^
【问题讨论】:
-
Movie::setMovieInfo的声明和定义的签名不匹配。 -
你还需要编译
Movie.cpp,g++ Movie.cpp main.cpp -o main -
正如@Niall 指出的那样,在
Movies.h中有Movie(std::string title, int releaseYear, std::string description)(无参考参数),而在Movies.cpp中有Movie::Movie(std::string &title, int releaseYear, std::string &description)(参考参数) -
另外,在编译时设置警告通常是个好主意:
g++ -Wall *.cpp -
在构造函数中对
setMovieInfo的调用应该是setMovieInfo(title, releaseYear, description);
标签: c++ class pointers reference