C ++ с использованием класса от заголовка в классе -- c++ поле с участием class поле с участием header пол Связанный проблема

C++ Using a class from a header within a class


-1
vote

проблема

русский

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

У меня есть время занятий во времени. Как:

 <код> #ifndef TIME_H #define TIME_H #include <iostream> using namespace std;  class Time   { private:     int hour, minute, second; public:     Time();     ~Time();      Time(int h, int m, int s);      int getHour();     int getMinute();     int getSecond();      void setHour(int hour);     void setMinute(int minute);     void setSecond(int second);      Time getTimeFromUser(Time b);     bool validTime(Time a);     void print24Hour(Time a);     void print12Hour(Time b); };  #endif   

Storce.h

 <код> #ifndef SCHEDULE_H #define SCHEDULE_H #include <iostream> #include "time.h" using namespace std;  class Class  {     private:         string name;         int credits;         bool majorRequirement;         double avgGrade;         string days;          Time startTime;         Time endTime;      public:         Class();         ~Class();          Class(string namae, int cred, bool majorReq, double avg, string day);          //Mutate         void setName(string h);         void setCredits(int c);         void setMajorRequirement(bool set);         void setAvgGrade(double g);         void setDays(string d);          void getStartTimeFromUser(Time b);         void getEndTimeFromUser(Time e);          // Access         string getName();         int getCredits();         bool getMajorRequirement();         double getAvgGrade();         string getDays();          Time& getStartTime();         Time& getEndTime(); };  #endif   

schang.cpp:

 <код> Class::Class()  {     string name = "";     int credits = 0;     bool majorRequirement = false;     double avgGrade = 0.0;     string days = ""; }  Time::Time() {     int hour = 0;     int minute = 0;     int second = 0; }  Class::Class(string namae, int cred, bool majorReq, double avg, string day)  {     name = namae;     credits = cred;     majorRequirement = majorReq;     avgGrade = avg;     days = day; }  Time::Time(int h, int m, int s) {     second = s;     minute = m;     hour = h; }  Time getTimeFromUser(Time b) {     string time = "";      string hourS, minuteS, secondS = new string();      getline(cin,time);      hourS = time.substr(0,2);     minuteS = time.substr(3,2);     secondS = time.substr(6,2);      b.hour = atoi(hourS.c_str());     b.minute = atoi(minuteS.c_str());     b.second = atoi(secondS.c_str());      return b; }  void getStartTimeFromUser(Time b) {     startTime = getTimeFromUser(b); }  void getEndTimeFromUser(Time e) {     endTime = getTimeFromUser(e); }   Other Mutators and Accessors here.   

Главная длинная. Вот серьезно конденсированная версия:

 <код> #include <iostream> #include <stdio.h> #include <stdlib.h> #include <iomanip> #include "time.h" #include "schedule.h" using namespace std;  int main() {     // Expecting that variables are properly declared      Class * klass = new Class[classcount];      cout << "Enter the start time for the class (format is HH:MM:SS): ";     klass[i].getStartTimeFromUser(classB);      cout << "Enter the end time for the class (format is HH:MM:SS): ";     klass[i].getEndTimeFromUser(classE);  for(int i = 0; i < classcount; i++)     {     // Data collected via getline and changed through mutators/accessors     // Problems arise when working with Time      klass[i].getStartTime().print24hour();     } }   

Я получаю довольно много «час, второй, минуту и ​​т. Д.» Являются ли частные ошибки, я думаю, я делаю что-то простое довольно неправильно. Пожалуйста, помогите.

Я получаю много этого:

 <код> time.h:10:7: error: ‘int Time::hour’ is private schedule.cpp:146:4: error: within this context time.h:10:13: error: ‘int Time::minute’ is private schedule.cpp:147:4: error: within this context time.h:10:21: error: ‘int Time::second’ is private schedule.cpp:148:4: error: within this context schedule.cpp: In function ‘void getStartTimeFromUser(Time)’: schedule.cpp:155:16: error: ‘setStartTime’ was not declared in this scope schedule.cpp: In function ‘void getEndTimeFromUser(Time)’: schedule.cpp:160:2: error: ‘endTime’ was not declared in this scope time.h: In function ‘bool validTime(Time)’:   
Английский оригинал

I'm having a bit of trouble with classes used within classes, from header files.

I have a class time in time.h:

#ifndef TIME_H #define TIME_H #include <iostream> using namespace std;  class Time   { private:     int hour, minute, second; public:     Time();     ~Time();      Time(int h, int m, int s);      int getHour();     int getMinute();     int getSecond();      void setHour(int hour);     void setMinute(int minute);     void setSecond(int second);      Time getTimeFromUser(Time b);     bool validTime(Time a);     void print24Hour(Time a);     void print12Hour(Time b); };  #endif 

Schedule.h

#ifndef SCHEDULE_H #define SCHEDULE_H #include <iostream> #include "time.h" using namespace std;  class Class  {     private:         string name;         int credits;         bool majorRequirement;         double avgGrade;         string days;          Time startTime;         Time endTime;      public:         Class();         ~Class();          Class(string namae, int cred, bool majorReq, double avg, string day);          //Mutate         void setName(string h);         void setCredits(int c);         void setMajorRequirement(bool set);         void setAvgGrade(double g);         void setDays(string d);          void getStartTimeFromUser(Time b);         void getEndTimeFromUser(Time e);          // Access         string getName();         int getCredits();         bool getMajorRequirement();         double getAvgGrade();         string getDays();          Time& getStartTime();         Time& getEndTime(); };  #endif 

Schedule.cpp:

Class::Class()  {     string name = "";     int credits = 0;     bool majorRequirement = false;     double avgGrade = 0.0;     string days = ""; }  Time::Time() {     int hour = 0;     int minute = 0;     int second = 0; }  Class::Class(string namae, int cred, bool majorReq, double avg, string day)  {     name = namae;     credits = cred;     majorRequirement = majorReq;     avgGrade = avg;     days = day; }  Time::Time(int h, int m, int s) {     second = s;     minute = m;     hour = h; }  Time getTimeFromUser(Time b) {     string time = "";      string hourS, minuteS, secondS = new string();      getline(cin,time);      hourS = time.substr(0,2);     minuteS = time.substr(3,2);     secondS = time.substr(6,2);      b.hour = atoi(hourS.c_str());     b.minute = atoi(minuteS.c_str());     b.second = atoi(secondS.c_str());      return b; }  void getStartTimeFromUser(Time b) {     startTime = getTimeFromUser(b); }  void getEndTimeFromUser(Time e) {     endTime = getTimeFromUser(e); }   Other Mutators and Accessors here. 

Main is long. Here is the severely condensed version:

#include <iostream> #include <stdio.h> #include <stdlib.h> #include <iomanip> #include "time.h" #include "schedule.h" using namespace std;  int main() {     // Expecting that variables are properly declared      Class * klass = new Class[classcount];      cout << "Enter the start time for the class (format is HH:MM:SS): ";     klass[i].getStartTimeFromUser(classB);      cout << "Enter the end time for the class (format is HH:MM:SS): ";     klass[i].getEndTimeFromUser(classE);  for(int i = 0; i < classcount; i++)     {     // Data collected via getline and changed through mutators/accessors     // Problems arise when working with Time      klass[i].getStartTime().print24hour();     } } 

I get quite a few "hour, second, minute, etc." are private errors, I'm guessing I'm doing something simple in a rather wrong way. Please help.

I get a lot of this:

time.h:10:7: error: ‘int Time::hour’ is private schedule.cpp:146:4: error: within this context time.h:10:13: error: ‘int Time::minute’ is private schedule.cpp:147:4: error: within this context time.h:10:21: error: ‘int Time::second’ is private schedule.cpp:148:4: error: within this context schedule.cpp: In function ‘void getStartTimeFromUser(Time)’: schedule.cpp:155:16: error: ‘setStartTime’ was not declared in this scope schedule.cpp: In function ‘void getEndTimeFromUser(Time)’: schedule.cpp:160:2: error: ‘endTime’ was not declared in this scope time.h: In function ‘bool validTime(Time)’: 
</div
        
         
         

Список ответов

3
 
vote

Есть несколько ошибок в вашем коде:

    .
  • Я предполагаю <код> class в вашем <код> main() Функция представляет собой массив <Код> Class ; Но это незаконно, поскольку <код> class - это ключевое слово C ++.

  • Вы пытаетесь получить доступ к частному участнику <код> Class объекта (<Код> class[i].startTime ). Это незаконно. Вам понадобится Открытый доступ к этому участнику данных:

  • Вы называете функцию, которая не существует (<код> print24() ). если ты Предназначен для звонка <Код> print24hour() , эта функция не принимает параметров.

Сделать все вместе, вам нужно сделать три вещи:

  1. Добавить аксессуар для <код> startTime в <Код> Class :

     <код> main()0  
  2. Используйте юридическое имя для вашего массива и использовать <код> main()1 или <код> main()2 :

     <код> main()3  
  3. Вызовите правильные методы правильно:

     <код> main()4  
 

There are several errors in your code:

  • I assume class in your main() function represents an array of Class; but this is illegal, since class is a C++ keyword.

  • You are trying to access a private member of a Class object (class[i].startTime). This is illegal again. You would need a public accessor to that data member:

  • You are calling a function that does not exist (print24()). If you intended to call print24hour(), this function takes no parameters.

Putting it all together, you need to do three things:

  1. Add an accessor for startTime in Class:

    class Class {   //... public:   Time GetStartTime() {return startTime;} }; 
  2. Use a legal name for your array and use std::vector or std::array:

    std::vector<Class> classArray; // OR: std::array<Class, SIZE> classArray; 
  3. Call the right methods correctly:

    classArray[i].GetStartTime().print24hour(); 
</div
 
 
     
     
0
 
vote

Я хочу получить доступ <код> main()5 из <код> main()6 Вам нужно сделать <код> main()7 public.

Если это хороший стиль, это другой вопрос.

 

I you want to access class[i].startTime.print24(getStartTime()) from main you need to make startTimepublic.

If this is good style is a different question.

</div
 
 
0
 
vote

Вы пытаетесь получить доступ к частным членам класса, используя объект напрямую.

Пожалуйста, читайте о государственном и частном доступе Спецификаторы здесь .

 

You are trying to access the private members of a class using the object directly.

Please read about public and private access specifiers here.

</div
 
 
0
 
vote
 <код> main()8  

Вы хотите либо это, либо сделать <код> main()9 public.

Обратите внимание <код> Class0 ; Если вы не хотите, чтобы возвращенные ссылки были <код> print24()21 , то сделайте <код> Class2 public прямо сейчас. Вы можете подумать, что делает его <код> Class3 улучшает инкапсуляцию; И да, он, пока вы не предоставляете доступ для записи считывания к переменной, что происходит, если вы не отметили тип возврата функции элементов <код> Class4 .

Если ваша функция печати не помечена <код> Class5 , то ваша корректность Const - не существует. Если использование Const Reference в качестве возврата типа здесь, то у вас есть некоторые вещи, чтобы исправить.

Связанное чтение: псевдоклассы и квази-классы .

 
class Class {     private:       Time startTime;      public:       const Time & getStartTime(){         return startTime;       }     };  int main() {     Class c;     c.getStartTime().print24Hour();  } 

You want either that, or make startTime public.

Note the const; if you don't want the returned reference to be const, then make startTime public right now. You may think that making it private improves encapsulation; and yes, it does, as long as you don't provide read-write access to the variable, which happens if you don't mark the member function return type const.

If your printing function isn't marked const, then your const-correctness doesn't exist. If using const reference as return type here, then you have some things to fix.

Related reading: Pseudo-Classes and Quasi-Classes.

</div
 
 
   
   

Связанный проблема

3  Как создавать закрытые зоны (выпуклые многоугольники) от набора сегментов линии?  ( How to create closed areas convex polygons from set of line segments ) 
Следующая проблема находится в 2D, поэтому некоторые упрощения могут быть сделаны при предложении ответов. Мне нужно создать закрытые области (определены ли...

1  Как работают Char и INT в C ++  ( How do char and int work in c ) 
Может быть, я собираюсь задать глупый вопрос, но я хочу подтвердить, как работает Char? Позвольте мне объяснить с примерами того, что я хочу спросить. Пусть п...

29  Добавление! Оператор и SQRT (), POW () и т. Д. Для пример примерка калькулятора  ( Adding the operator and sqrt pow etc to a calculator example applicatio ) 
Я делаю упражнения в новой книге Strustrup "Принципы программирования и практики с использованием C ++" и было интересно, если кто-нибудь на переполнении ст...

14  Классы, Rvalues ​​и Rvalue Список  ( Classes rvalues and rvalue references ) 
Lvalue - это значение, связанное с окончательной областью памяти, тогда как rvalue - это значение выражения, существование которого является временным, а не о...

145  Как определить, является ли строка номер с C ++?  ( How to determine if a string is a number with c ) 
У меня было довольно неприятностей, пытаясь написать функцию, которая проверяет, является ли строка номер. Для игры, которую я пишу, мне просто нужно проверит...

3  Отправка HTTP Post Запрос на обновление содержимого файла с использованием C ++ REST SDK Casablanca  ( Sending a http post request for updating file contents using c rest sdk casabl ) 
Я пытаюсь обновить содержимое файла на сервере Alfresco, используя C ++ SDK SDK. Я использую URL Alfresco CMIS URL для отправки запроса. Быть более конкретным...

3  Преобразование IPlimage в вектор в 1D в OpenCV  ( Converting iplimage into 1d vector in opencv ) 
Я хочу преобразовать MXN IPLIMAGE в вектору A (M * N) x 1 1. Может ли это сделать с любой функцией в OpenCV? Любая помощь значительно ценится. ...

1  Наличие проблемных проектов C ++ в Eclipse CDT в ОС X для глупой причины  ( Having trouble building c project in eclipse cdt in os x for a silly reason ) 
Я пытаюсь построить очень простую программу C ++ в Eclipse, и я получаю очень глупую ошибку: <код> **** Internal Builder is used for build **...

42  Как я могу легко увидеть график C / C ++ #include? [закрыто]  ( How can i see the c c include graph easily ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> закрыт. Этот вопрос не соответствует Рекомендациям переполнения ...

0  Как захватывать события, выпущенные из нового окна всплывающего  ( How to capture events fired from new popup ie window ) 
Приветствия! <Сильная> Ситуация: My ActiveX DLL содержит индивидуальный webbrowser. WebBrowser отображает веб-страницу. Когда пользователь нажимает на сс...

1  Проблема с использованием TextureView с NDK  ( Issue using textureview with ndk ) 
Я работаю над небольшим кусочком кода, используя текстуру, чтобы отобразить результат среды MediaPlayer. Я сталкиваюсь с проблемой, пытающимся смешивать упр...

4  Строка :: Новая: что это?  ( Stringnew what is it ) 
Я из фона Java и изучает C ++. Я столкнулся с следующим C ++: <код> String source = String::New("'Hello' + ', World'"); Как то, что я так понимаю, это ...

-2  Конструкторы ведут себя странным с кодом обработки исключений  ( Constructors behaving strange with exception handling code ) 
Скриншот # 1: Образец (образец & amp;) {...) // Нет ошибки без использования "const" Скриншот № 2: Destructor называется дважды, когда Copy-Constructor не вк...

0  Использование Pybind11 на MacBook Pro  ( Using pybind11 on macbook pro ) 
Я пытаюсь использовать Pybind11 на MacBook, и я пытаюсь сделать так, как было написано в https://pybind11.readtheDocs.io/en/stable/basics.html я установил C...

29  C ++ Указатель на объекты  ( C pointer to objects ) 
в C ++ У вас всегда инициализировать указатель на объект с new ключевое слово? или вы просто имеете это тоже: <код> MyClass *myclass; myclass->DoSometh...

Связанный проблема

3  Как создавать закрытые зоны (выпуклые многоугольники) от набора сегментов линии? 
1  Как работают Char и INT в C ++ 
29  Добавление! Оператор и SQRT (), POW () и т. Д. Для пример примерка калькулятора 
14  Классы, Rvalues ​​и Rvalue Список 
145  Как определить, является ли строка номер с C ++? 
3  Отправка HTTP Post Запрос на обновление содержимого файла с использованием C ++ REST SDK Casablanca 
3  Преобразование IPlimage в вектор в 1D в OpenCV 
1  Наличие проблемных проектов C ++ в Eclipse CDT в ОС X для глупой причины 
42  Как я могу легко увидеть график C / C ++ #include? [закрыто] 
0  Как захватывать события, выпущенные из нового окна всплывающего 
1  Проблема с использованием TextureView с NDK 
4  Строка :: Новая: что это? 
-2  Конструкторы ведут себя странным с кодом обработки исключений 
0  Использование Pybind11 на MacBook Pro 
29  C ++ Указатель на объекты