2017-01-18 4 views
-1

Я хотел бы, чтобы эта программа отображала строки «Gianna» «Maria» и «M» на экране, но я не могу. Ошибок нет, поэтому я думаю, что с моей программой что-то не так. Любые предложения, которые могли бы исправить мою программу?Строки C++ не работают

#include <iostream> 
#include <string> 
using namespace std; 
class name 
{ 
    string fName, mName, sName; 
    public: 
     name (string fName, string mName, string sName){}; 
     void setFName (string fName); 
     void setMName (string mName); 
     void setSName (string sName); 
     string getFName() const {return fName;} 
     string getSName() const {return sName;} 
     string getMName() const {return mName;} 
     friend ostream & operator <<(ostream &, const name &); 
}; 
ostream& operator<<(ostream& os, const name& n) { 
    return os << n.fName << " " << n.sName<< " " << n.mName; 
} 

int main() 
{ 
    name myName ("Gianna", "Maria", "M"); 
    cout<<myName.getFName()<<" "<<myName.getMName()<<" "<<myName.getSName()<<endl; 


    return 0; 
} 
+2

'имя (строка имя_файла, строка mName, строка зЫате)' - Это не очень хорошая идея, чтобы назвать ваши параметры так же, как ваши переменные-члены. Вероятно, поэтому вы подумали, что созданный вами конструктор волшебным образом задает эти переменные-члены, сопоставляя имена - нет, это не работает. – PaulMcKenzie

+0

Кроме того, вы можете использовать оперу << вашего класса в строке cout: 'cout << myName << endl;' – Rama

ответ

3

Ваш конструктор:

name (string fName, string mName, string sName){}; 

ничего не делает. Вам нужно использовать параметры для инициализации ваших переменных-членов.

name (string f, string m, string s) 
     : fName(f), mName(m), sName(s) {} 
+0

Спасибо всем: D – Marvin001

1

Ваш конструктор должен назначать параметры, которые вы передаете переменным-членам, что не происходит автоматически.

name (string fName, string mName, string sName) : fName(fName), mName(mName), sName(sName) {}; 
+0

Он работает !! Большое спасибо!!! : D – Marvin001

+0

Ну, на самом деле не «назначайте» в этом случае. –

+0

@latedeveloper присваивает значения этим переменным, даже если это технически не использует назначение для этого. Различие слишком тонко для меня, чтобы думать об этом нормально. –

2

Вы забыли инициализировать элементы класса daya в конструкторе.

Определить конструктор следующим образом

name(const string &fName, const string &mName, const string &sName) 
    : fName(fName), mName(mName), sName(sName) 
{ 
} 

Соответственно эти функции-члены должны быть определены как

void setFName (const string &fName) 
    { 
     this->fName = fName; 
    } 
    void setMName (const string &mName) 
    { 
     this->mName = mName; 
    } 
    void setSName (const string &sName) 
    { 
     this->sName = sName; 
    } 

Там нет необходимости, чтобы сделать operator << как друга функции класса. Он может быть определен как

ostream& operator <<(ostream& os, const name& n) { 
    return os << n.getFName() << " " << n.getMName() << " " << n.getSName(); 
} 
1

Для конструктора, у вас есть три строки, как ваши параметры, но вы не установки переменных-членов к их значениям. Вы можете использовать список инициализации в конструкторе, как это ...

name (string f, string m, string s) 
    : fName(f), mName(m), sName(s) // member(parameter) format 
{ 

} 

... или вы можете реализовать setter корешки у вас есть ...

void setFName(string name) { this->fName = name;} 

... и использовать их внутри ваш конструктор, как ...

name (string fName, string mName, string sName) { 
    setFName(fName); 
    //... 
} 
+0

@Slava, если я помню в настоящее время, внешнее значение принимается за переменные уровня класса и не ищет локально (в функции/constructor/etc). Возможно, лучше всего переключить имена параметров, которые будут безопасными ... –

0

в основном параметры, передаваемые в конструкторе теряется, так как вы не назначая его к классу вары ..

ли что-то вроде:

name (string f, string m, string s) : fName(f), mName(m), sName(s){....}; 
0

попробовать это. Вы забыли реализовать конструктор класса

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

using namespace std; 
class name 
{ 
    string sFName, sMName, sSName; 
    public: 
     name (string FName, string MName, string SName); 
     void Display(); 
     void setFName (string fName); 
     void setMName (string mName); 
     void setSName (string sName); 
     string getFName() const {return sFName;} 
     string getSName() const {return sSName;} 
     string getMName() const {return sMName;} 

}; 

name::name(string FName, string MName, string SName) 
{ 
    sFName = FName; 
    sMName = MName; 
    sSName = SName; 
} 

void name::setFName(string fName) 
{ 
     sFName = fName; 
} 

void name::setMName(string mName) 
{ 
     sMName = mName; 
} 

void name::setSName(string sName) 
{ 
     sSName = sName; 
} 

void name::Display() 
{ 
    cout<< sFName<< endl; 
    cout<< sMName<< endl; 
    cout<< sSName<< endl; 
} 
int main() 
{ 
    name myName ("Gianna", "Maria", "M"); 
    myName.Display(); 


    return 0; 
} 
+2

ОП реализовал конструктор. К сожалению, реализация ничего не делает. – user4581301