Объединение двух файлов, неправильное использование нестатического члена данных

#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;
}

0

Решение

Вы должны двигаться void Print() {...} определение в DVD определение класса, поэтому он может действовать как функция-член. Вам не понадобится DVD:: префиксы для каждого члена тогда.

Что касается файлов: Самый простой способ заставить это работать — поместить фрагмент кода в первый файл заголовка, второй — ваш исходный файл, где вы #include этот заголовок.

Вы также забываете ; после определения класса я вижу return0;и в этот момент я перестаю смотреть дальше.

1

Другие решения

Вы должны либо переместить Print() определение в DVD определение или объявить его внутри DVD определение и добавить DVD:: префикс перед Print(),

0

Вы не можете использовать DVD Члены класса в этом контексте, чтобы справиться с проблемой, вы должны восстановить свой Print функция в этом принципе, чтобы указать его как DVD член класса то же самое для SetInfo функция.

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

Весь код декларации-определения.

#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.h

#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__ */

Определение методов класса DVD в DVD.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);
}

чем в main.cpp

#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
}

для работы с файлом мы должны определить новый метод класса DVD

// 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);
}

так в main.cpp мы получили это

#include <iostream>
#include <string>
#include "DVD.h"
int main()
{
std::ifstream input_file("filename.txt");
DVD cInception;
cInception.SetInfo(input_file);

DVD cFightClub;
cFightClub.SetInfo(input_file);

DVD cPulpFiction;
cPulpFiction.SetInfo(input_file);

DVD cTheDarkKnight;
cTheDarkKnight.SetInfo(input_file);

DVD cAmericanHustle;
cAmericanHustle.SetInfo(input_file);

DVD cSilverLiningsPlaybook;
cSilverLiningsPlaybook.SetInfo(input_file);

DVD cTheHungerGames;
cTheHungerGames.SetInfo(input_file);

DVD cFurious7;
cFurious7.SetInfo(input_file);

DVD cSavingPrivateRyan;
cSavingPrivateRyan.SetInfo(input_file);

DVD cGladiator;
cGladiator.SetInfo(input_file);

//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
}
0