2012-08-07 84 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;} 

另外,露出直接访问字段(即下公共部门他们搬迁到)不是忌讳。请记住,这不是大多数人希望看到的。