合并两个文件,无效使用非静态数据成员

时间:2015-11-16 22:20:34

标签: c++ non-static datamember

#include <iostream>
#include <string>

class DVD {
public:
    char m_strTitle[25];
    int m_nYearOfRelease;
    char m_strGenre[25];
    char m_strRentalStatus[50];
}

void Print()
{
    using namespace std;
    cout << "Title" << DVD::m_strTitle << "YearOfRelease" << DVD::m_nYearOfRelease << "Genre" << DVD::m_strGenre
         << "RentalStatus" << DVD::m_strRentalStatus << endl;
}

这是我的第一个文件,它产生5次无效使用非静态数据成员错误,我不太清楚这意味着什么,所以如果有人能指出我正确的方向,那将是值得赞赏的。我还想将它与另一个我声明10种DVD类型的文件结合起来,通常我会把它们全部作为一个文件但是我需要为我的作业做的问题要求我创建一个包含10个DVD的数组并填充它们使用输入文件中的信息,所以这里也是我输入的文件。

#include <iostream>
#include <cstring>

// Set the Info for 10 DVDs
void SetInfo(const char* strTitle, int nYearOfRelease, const char* strGenre, const char* strRentalStatus) {
    strncpy(m_strTitle, strTitle, 25);
    m_nYearOfRelease = nYearOfRelease;
    strncpy(m_strGenre, strGenre, 25);
    strncpy(m_strRentalStatus, strRentalStatus, 50);
}

int main() {
    // Declare 10 DVDs
    DVD cInception;
    cInception.SetInfo("Inception", 2010, "Action", "In stock");

    DVD cFightClub;
    cFightClub.SetInfo("Fight Club", 1999, "Action/Suspense", "Due back November12th");

    DVD cPulpFiction;
    cPulpFiction.SetInfo("Pulp Fiction", 1994, "Action", "In Stock");

    DVD cTheDarkKnight;
    cTheDarkKnight.SetInfo("The Dark Knight", 2008, "Drama", "In Stock");

    DVD cAmericanHustle;
    cAmericanHustle.SetInfo("American Hustle", 2013, "Drama", "Due back December1st");

    DVD cSilverLiningsPlaybook;
    cSilverLiningsPlaybook.SetInfo("Silver Linings Playbook", 2012, "Drama/Romance", "In Stock");

    DVD cTheHungerGames;
    cTheHungerGames.SetInfo("The Hunger Games", 2012, "Adventure", "Due Back Today at 12pm");

    DVD cFurious7;
    cFurious7.SetInfo("Furious 7", 2015, "Action", "One Left in Stock");

    DVD cSavingPrivateRyan;
    cSavingPrivateRyan.SetInfo("Saving Private Ryan", 1998, "Drama/War", "Discontinued");

    DVD cGladiator;
    cGladiator.SetInfo("Gladiator", 2000, "Action", "In Stock");

    // Print out DVD Info
    cInception.Print();
    cFightClub.Print();
    cPulpFiction.Print();
    cTheDarkKnight.Print();
    cAmericanHustle.Print();
    cSilverLiningsPlaybook.Print();
    cTheHungerGames.Print();
    cFurious7.Print();
    cSavingPrivateRyan.Print();
    cGladiator.Print();

    return0;
}

3 个答案:

答案 0 :(得分:1)

您需要将void Print() {...}定义移动到DVD类定义中,以便它可以充当成员函数。那么每个成员不需要DVD::前缀。

关于文件:让它工作的最简单方法是将第一个代码段放入头文件中,第二个是源文件,其中#include标题。

在课程定义之后你也忘记了;,我看到了return0;,此时,我正在停下来进一步研究。

答案 1 :(得分:0)

您必须将Print()定义移至DVD定义,或在DVD定义中声明,并在DVD::之前添加Print()前缀

答案 2 :(得分:0)

您不能在该上下文中使用DVD类成员来处理问题,您必须在该原则中重建Print函数,以将其指定为DVD类成员,同样适用于{{ 1}}功能。

SetInfo

整个声明 - 辩护代码。

void DVD::Print()
{
     using namespace std;
     cout << "Title" << m_strTitle << "YearOfRelease" << m_nYearOfRelease << "Genre" << m_strGenre <<
     "RentalStatus" << m_strRentalStatus << endl;
}

将程序创建为不同的翻译单元。

类声明必须在DVD.h中

#include <iostream>
#include <string>

class DVD 
{
    public:
    char m_strTitle[25];
    int m_nYearOfRelease;
    char m_strGenre[25];
    char m_strRentalStatus[50];
    void Print();
    void SetInfo(const char *strTitle, int nYearOfRelease, const char *strGenre, const char *strRentalStatus);
};

void DVD::Print()
{
     using namespace std;
     cout << "Title" << m_strTitle << "YearOfRelease" << m_nYearOfRelease << "Genre" << m_strGenre <<
     "RentalStatus" << m_strRentalStatus << endl;
}

// Set the Info for 10 DVDs
// Also DVD class member function
void DVD::SetInfo(const char *strTitle, int nYearOfRelease, const char *strGenre, const char *strRentalStatus) 
{
     strncpy(m_strTitle, strTitle, 25);
     m_nYearOfRelease = nYearOfRelease;
     strncpy(m_strGenre, strGenre, 25);
     strncpy(m_strRentalStatus, strRentalStatus, 50);
}

int main()
{
     //Declare 10 DVDs
     DVD cInception;
     cInception.SetInfo("Inception", 2010, "Action", "In stock");

     DVD cFightClub;
     cFightClub.SetInfo("Fight Club", 1999, "Action/Suspense", "Due back November12th");

     DVD cPulpFiction;
     cPulpFiction.SetInfo("Pulp Fiction", 1994, "Action", "In Stock");

     DVD cTheDarkKnight;
     cTheDarkKnight.SetInfo("The Dark Knight", 2008, "Drama", "In Stock");

     DVD cAmericanHustle;
     cAmericanHustle.SetInfo("American Hustle", 2013, "Drama", "Due back December1st");

     DVD cSilverLiningsPlaybook;
     cSilverLiningsPlaybook.SetInfo("Silver Linings Playbook", 2012, "Drama/Romance", "In Stock");

     DVD cTheHungerGames;
cTheHungerGames.SetInfo("The Hunger Games", 2012, "Adventure", "Due Back Today at 12pm");

     DVD cFurious7;
     cFurious7.SetInfo("Furious 7", 2015, "Action", "One Left in Stock");

     DVD cSavingPrivateRyan;
     cSavingPrivateRyan.SetInfo("Saving Private Ryan", 1998, "Drama/War", "Discontinued");

     DVD cGladiator;
     cGladiator.SetInfo("Gladiator", 2000, "Action", "In Stock");

     //Print out DVD Info

     cInception.Print();
     cFightClub.Print();
     cPulpFiction.Print();
     cTheDarkKnight.Print();
     cAmericanHustle.Print();
     cSilverLiningsPlaybook.Print();
     cTheHungerGames.Print();
     cFurious7.Print();
     cSavingPrivateRyan.Print();
     cGladiator.Print();

     return 0; // fix return statement member
}

DVD.cpp中DVD类方法的定义

#ifndef __DVD_H__
#define __DVD_H__

#include <iostream>
#include <string>

class DVD 
{
    public:
    char m_strTitle[25];
    int m_nYearOfRelease;
    char m_strGenre[25];
    char m_strRentalStatus[50];
    void Print();
    void SetInfo(const char *strTitle, int nYearOfRelease, const char *strGenre, const char *strRentalStatus);
};

#endif /* __DVD_H__ */

比在main.cpp中

#include "DVD.h"

void DVD::Print()
{
     using namespace std;
     cout << "Title" << m_strTitle << "YearOfRelease" << m_nYearOfRelease << "Genre" << m_strGenre <<
     "RentalStatus" << m_strRentalStatus << endl;
}

// Set the Info for 10 DVDs
// Also DVD class member function
void DVD::SetInfo(const char *strTitle, int nYearOfRelease, const char *strGenre, const char *strRentalStatus) 
{
     strncpy(m_strTitle, strTitle, 25);
     m_nYearOfRelease = nYearOfRelease;
     strncpy(m_strGenre, strGenre, 25);
     strncpy(m_strRentalStatus, strRentalStatus, 50);
}

使用文件我们必须定义新的DVD类方法

#include <iostream>
#include <string>
#include "DVD.h"

int main()
{
     //Declare 10 DVDs
     DVD cInception;
     cInception.SetInfo("Inception", 2010, "Action", "In stock");

     DVD cFightClub;
     cFightClub.SetInfo("Fight Club", 1999, "Action/Suspense", "Due back November12th");

     DVD cPulpFiction;
     cPulpFiction.SetInfo("Pulp Fiction", 1994, "Action", "In Stock");

     DVD cTheDarkKnight;
     cTheDarkKnight.SetInfo("The Dark Knight", 2008, "Drama", "In Stock");

     DVD cAmericanHustle;
     cAmericanHustle.SetInfo("American Hustle", 2013, "Drama", "Due back December1st");

     DVD cSilverLiningsPlaybook;
     cSilverLiningsPlaybook.SetInfo("Silver Linings Playbook", 2012, "Drama/Romance", "In Stock");

     DVD cTheHungerGames;
cTheHungerGames.SetInfo("The Hunger Games", 2012, "Adventure", "Due Back Today at 12pm");

     DVD cFurious7;
     cFurious7.SetInfo("Furious 7", 2015, "Action", "One Left in Stock");

     DVD cSavingPrivateRyan;
     cSavingPrivateRyan.SetInfo("Saving Private Ryan", 1998, "Drama/War", "Discontinued");

     DVD cGladiator;
     cGladiator.SetInfo("Gladiator", 2000, "Action", "In Stock");

     //Print out DVD Info

     cInception.Print();
     cFightClub.Print();
     cPulpFiction.Print();
     cTheDarkKnight.Print();
     cAmericanHustle.Print();
     cSilverLiningsPlaybook.Print();
     cTheHungerGames.Print();
     cFurious7.Print();
     cSavingPrivateRyan.Print();
     cGladiator.Print();

     return 0; // fix return statement member
}

所以在main.cpp中我们得到了这个

// Defile new class method
void DVD::SetInfo(std::istream& stream) 
{         
     // Read title
     stream.getline(m_strTitle, 25);
     // Read year of release
     stream >> m_nYearOfRelease 
     // Read genre
     stream.getline(m_strGenre, 25);
     // Read rental status
     stream.getline(m_strRentalStatus, 50);
}