2014-03-24 6 views
2

포인터 및 문자가 함수로 전달되는 이미지가 불명확합니다. ? 어디에서 그들을 사용한다, 등등 ...이 코드포인터로 C++에서 전달되는 문자

//b1.setData에 오류가

#include <iostream> 
using namespace std; 
class book{ 
private: 
    char *CName; 
    int CFee; 
    int NoPeople; 
    int Income; 
public: 
    void setData(char &x,int y,int z){ 
     CName = &x; 
     CFee = y; 
     NoPeople = z; 

    } 
    void calIncome(){ 
     Income = CFee * NoPeople; 

    } 
    void viewIncome(){ 
     cout<<Income; 
     cout<<CName; 

    } 
}; 
int main(){ 
    book b1; 
    b1.setData('DISE',20000,30); 
    b1.calIncome(); 
    b1.viewIncome(); 
} 

메신저 (: 사람이 어디 메신저 포인터에 대해 잘못과 간단한 생각을하고 전 말해 줄 수주십시오 'DISE', 20000, 30); 즉 문자열, 여러 문자가있는 경우

+1

πάντα ῥεῖ 답은 정확합니다. 어쨌든 C++가 아닌 C를 사용하고 있기 때문에 문자로 작업하는 것을 단순화하는 클래스 sdt : string이 포함 된 표준 라이브러리를 사용하는 것이 좋습니다 – varantir

답변

0

당신은 void setData(const char *x,int y,int z)

-setData() 선언을 변경해야합니다 정렬.

은 또한 당신은 전화에 문자 배열 리터럴 지정하지 :

b1.setData('DISE',20000,30); 

코드에서

b1.setData("DISE",20000,30); 
     //^^
+0

안녕하세요. , 나는 이렇게했다. 하지만 다른 오류가 생겼어. 스크린 샷보기 https://www.dropbox.com/s/5czedhrmzrdci0o/Screenshot%202014-03-24%2017.21.10.png –

+0

@ImBatman 죄송합니다. 문자 배열을 전달하는 ** 리터럴 ** 당신은' const char *'물론 포인터. 또한 배열 할당을 제공하고 매개 변수에서 복사하여 클래스 내부 포인터를 유지하고 하나의 'const'가 일반적으로 의미가 없다고 선언해야합니다.대답을 수정했습니다 ... –

+0

고마워요. –

0
b1.setData('DISE',20000,30); 

숯불, 'D'처럼, 하나의 문자입니다 "const가 아닌 lvalue를 참조 형 'INT'의 temparory에 바인딩 할 수 없습니다 '문자'를 입력합니다"하고 전달해야합니다. "DISE"

메소드 서명을 사용하면 void setData(char &x,int y,int z) 문자 만 전달할 수 있습니다. 그것은 한 문자입니다. 당신은 당신이 문자를 가리 키도록 의미하는 char* 포인터를 할당 할 수 없습니다 매개 변수로 단일 char에 대한 참조를 기대하고있는 것처럼

+0

고마워 .. 생각이 났어 –

2

로 변경해야 포인터에 대한 필요가 없습니다. 당신은 std::string를 사용해야합니다

#include <string> 
... 
string CName 
... 
void setData(const string& x,int y,int z){ 
    CName = x; 

setData

은 큰 따옴표 (문자열있는) 대신 (개별 문자입니다) 작은 따옴표를 사용해야합니다 호출합니다.

+0

안녕하세요, 감사합니다. 하지만 출력을 받고 있지 않습니다. 이것은 Xcode와 관련이 있습니다. 여기 스크린 샷 https://www.dropbox.com/s/nxeerxheryu7nr2/Screenshot%202014-03-24%2017.26.40.png –

+0

문자열을 저장하려는 유일한 의도 인 경우 * 값 *으로 전달하고 회원. –

0

setData 여기서 metod는 완전히 쓸모가 없습니다. 이 작업은 생성자와 name 변수로 이루어져야합니다 (CName이 아니어야합니다. std::string). viewIncome은 자동으로 calIncome을 호출해야하며 더티 플래그가 도입되어야합니다. 그렇지 않으면 calIncome은 자유/정적 함수 여야하며 .. income 회원

함수 매개 변수도 합리적으로 자막해야 제거하고 난 질문 답변 해 드리겠습니다 :.

class Book { 
    std::string name; 
    int fee; 
    int noPeople; 
    int income; 

public: 
    Book(std::string name, int fee, int noPeople) : 
     name(std::move(name)), 
     fee(fee), 
     noPeople(noPeople) 
    { 
    } 

    void calIncome() { 
     income = fee * noPeople; 
    } 

    void viewIncome() { 
     calIncome(); 
     std:: cout << income << name; 
    } 
}; 

int main() { 
    Book b1 ("DISE", 20000, 30); 
    b1.viewIncome(); 
} 

라이브 on Coliru을보기를

+0

Bartek에게 감사드립니다. 우리 강사는 항상 char를 사용했습니다. 전에는 문자열을 사용하지 않았습니다. 지금은 문자열 (뿐만 아니라)을 사용하여 생각할 수 있습니다 (상자 밖으로) 감사합니다 –

관련 문제