2012-08-07 34 views
0

我試圖找出類是如何工作的,但我有一點麻煩顯示類變量。在printf函數中使用字符串作爲參數。

的main.cpp

#include <stdio.h> 
#include "Student.h" 
#include <stdlib.h> 

void main() 
{ 
Student students; 

students.Print(); 

system("pause"); 

} 

Student.h

#pragma once 
#include <string.h> 
#include <iostream> 
using namespace std; 

class Student 
{ 
public: 
    Student(void); 
    ~Student(void); 
    void Print(void); 
private: 
    int IDone; 
    int IDtwo; 
    string studentOne; 
    string studentTwo; 
}; 

Student.cpp

#include "Student.h" 

Student::Student(void) 
{ 
    studentOne = "John Doe"; 
    studentTwo = "Jane Doe"; 
    IDone = 227768; 
    IDtwo = 227769; 
} 

Student::~Student(void) 
{ 
} 
void Student::Print(void) 
{ 
    printf("Student name: %s\n", studentOne); 
    printf("Student ID: %d\n", IDone); 
    printf("Student name: %s\n", studentTwo); 
    printf("Student ID: %d\n", IDtwo); 

} 

當這個運行時,我得到:

Student name: <null> 
    Student ID: 227768 
    Student name: <null> 
    Student ID: 227769 

後來我希望能夠更改名稱和ID。另外,可以將這些成員放在一個數組中,這樣我就可以通過學生[0]和學生[1]打印它們了?

+0

添加一個家庭作業標籤。如果不適用,請刪除它。 – 2012-08-07 08:11:08

+1

究竟是什麼問題? – 2012-08-07 08:11:13

+0

一個小方面的說明:「學生」班的設計似乎......錯了。主要是因爲它可能應該被命名爲「學生」,因爲它包含關於兩名學生的信息。 「學生」(單數)意味着一個學生。 – 2012-08-07 08:14:40

回答

4

閱讀關於std::string的參考資料,您將找到一種名爲c_str的方法,該方法用於獲取可用於例如C語言風格的C風格字符指針。 printf

或者只是開始使用std::cout代替:

void Student::Print(void) 
{ 
    std::cout << "Student name: " << studentOne << '\n'; 
    std::cout << "Student ID: " << IDone << '\n'; 
    std::cout << "Student name: " << studentTwo << '\n'; 
    std::cout << "Student ID: " << IDtwo << '\n'; 
} 
1

您需要使用STL容器,如vector代替陣列來存儲你的學生的細節,你應該重塑你的學生類,像這樣

class Student 
{ 
private: 
string Name; 
int Id; 
public: 
Student(string name, int id); 
string GetName(); 
void SetName(name); 
int GetId(); 
void SetId(int id); 
void Print(); 
}; 

和你的主要應該是這樣的

void main() 
    { 
     vector<Student> studentList; 

     Studen one("John Doe", 1); 
     Studen two("Jane Doe", 2); 

     studentList.push_back(one); 
     studentList.push_back(two); 

     vector<Student>::const_iterator cii; 
     for(cii=Student.begin(); cii!=Student.end(); cii++) 
     { 
      *cii.Print(); 

     } 

    } 
0
printf("Student name: %s\n", studentOne); 

導致未定義的行爲。您需要傳遞適合%s格式說明符的c樣式字符串,即studentOne.c_str()

所以能夠在一種類型的陣列的這些構件,所以我可以 通過去學生打印[0]和學生[1]

你總是可以聲明的std::string數組作爲任何其他數據類型。

class Student 
{ 
    ... 
    string students[N]; // or vector<string> students; 
}; 
0
printf("Student name: %s\n", studentOne); 

不能傳遞一個C++ std::string到C printf功能;您只能傳遞與C語言共享的基本類型;傳遞一個類的類型會導致未定義的行爲。

你可以使用C++輸出:

std::cout << "Student name: " << studentOne << std::endl; 

,或者,如果你真的想用C輸出中由於某種原因,你可以提取從std::string C風格的字符串:

printf("Student name: %s\n", studentOne.c_str()); 
             ^^^^^^^^ 

此外,可以將這些成員放在一個數組中,這樣我就可以通過學生[0]和學生[1]打印它們了?

是的,你可以把大多數類型,包括類,在數組:

std::string student[2]; // array of two strings. 

如果你想有一個可變數目,使用動態數組:

std::vector<std::string> student; 

這似乎是一個儘管如此,單個Student有兩個名字和兩個ID。這個班不應該代表一個人嗎?

0

另外,也可以具有在類型的陣列,這些構件,所以我可以通過去學生[0]和學生[1]打印?

肯定。如果你知道學生前期的號碼,那麼你可以:

string students[2]; 

本聲明將有效地分配內存中的兩個string對象,並可以通過數組索引引用它們。

如果您不知道需要多少學生,那麼最好使用std::vector類,因爲它是用C++表示動態數組的首選方式。

您將studentOne,studentTwo,IDOne和IDTwo數據成員放置在類聲明的專用部分下。這意味着您只能在Student類實現中直接操作它們。大多數其他程序員期望您遵循的方法是創建特殊的getter和setter方法:

const std::string& studentOne() const {return studentOne;} 
void setStudentOne(const std::string& aStudentOne) {studentOne = aStudentOne;} 

等等。創建setStudentOne特別有用,當你想有一些副作用。否則,你可以有一個方法來訪問它:

std::string& getStudentOne() {return studentOne;} 

另外,露出直接訪問字段(即下公共部門他們搬遷到)不是忌諱。請記住,這不是大多數人希望看到的。

相關問題