2012-06-20 4 views
0

나는 C++을 배우고있다. 이미 자바를 알고있다. C# +++. 그래서 나는 그것이 공원의 산보 일 것이다라고 생각했다. 그러나 부정!! 내가하고 싶은 것은 add 함수를 통해 벡터 "데이터"에 문자열을 추가 할 수있는 간단한 개체 ("test")를 만든 다음 인쇄하는 일종의 인쇄 기능을 만들 수 있습니다. 나는 어떤 입력을 감상 할 수있다 :)초보자, 객체 만들기를 돕기

Call: 
test a; 
a.add("blabla"); 
a.print(); 

test.h: 
class test{ 
    vector<string>* data; 
    std::string str; 
public: 
    test(); 
    void add(std::string t); 
}; 

**test.cpp:** 
test::test() { 
data = new vector<string>; 
} 

void test::add(std::string t) { 
data->pushback(t); 
} 

void test::print() { 
cout << data[0]; 
} 
+3

첫 번째로 만든 개체를 삭제하는 것을 기억하는 것이 중요하다 * 테스트 벡터 포인터가 ::

void test::print() { cout << (*data)[0]; } 

를 인쇄 당신이 참조를 해제하는 것을 잊었다 생각 스택을 사용하십시오 :'vector data;'. 기본 초기화되고 사용하는 메모리를 확보 할 필요가 없습니다. 둘째, 오류 메시지는 훌륭하지만,'push_back' 대신에'pushback'을 사용하는 것이 좋습니다. – chris

+2

+1 왜 내가 downvoted 이유 모르겠어요. 이 질문은 잘 표현되어 있지 않지만, 처음에는 낯선 것을 배우는 경우가 무엇인지 물어 보는 것이 어렵고 문제의 90 %를 알기도합니다. 인내심을 갖고 경험이 부족한 사용자를 수용 할 수 있습니다. – gbtimmon

+0

그래서 문제가 무엇입니까? 컴파일 오류? 출력이 예상과 다릅니다. 실제로 당신은 진짜 질문을해야합니다. – betabandido

답변

0

당신이 당신의 주요 방법으로 파일의 test.h를 포함하는 기억나요, 뭔가 아래에 표시하게 시도했습니다?

또한 std::cout을 사용하거나 코드에 using namespace std; 행이 있어야합니다.

addtion에서 벡터 푸시 백 방법 push_back()하지 pushback()이다. 이것은 당신이 기억해야 할 매우 중요한 일이다

test::~test() 
{ 
    delete data; 
} 

: 당신이 당신의 생성자에서 new 키워드를 사용하고 있기 때문에

마지막으로, 당신은 다음과 같이 보일 것이라고뿐만 아니라 소멸자가 필요합니다 Java 또는 C#과 반대로 C++ 프로그래밍을 수행하고 있습니다. C++ 구현은 자동으로 가비지 수집을하지 않으므로 할당 된 메모리를 스스로 해제해야합니다.

편집 :

는 또한, 응답 중 하나가 아래에 또 다른 문제를 지적한다. 인덱싱하기 전에 벡터 포인터를 역 참조하는 것을 잊었습니다. (*data)[0]을 인쇄해야합니다. 이야기의 도덕은, 당신이 vector에 포인터보다는 오히려 vector 자료를 만든 경우에, 확실히 더 쉽고 더 낫습니다. 자바와 C#에서 다른 C를 만드는 기본적인 것은 ++의

+1

물론 복사/이동 생성자와 할당 연산자. 포인터를 사용하지 않을 때 포인터를 사용하면 훨씬 더 심해집니다. – chris

+0

@chris true이지만, 이것은 단지 테스트 프로그램이라고 생각하면 문제를 일으키지 않을 것입니다. 네가 맞다고 생각해. 메모리 누출로 인해 실제 문제가 발생할 가능성은 거의 없습니다. – Daniel

+1

하지만 앞으로는 그렇게 될 것이고 또한 들어가는 것이 아주 좋은 습관입니다. 자바 프로그래머가 C++로 갈 수있는 최선의 방법 중 하나는 실제로 포인터가 필요할 때 포인터를 사용하는 것을 지연시키는 것입니다. – chris

2

하나는 C++에있는 모든 클래스가 "값 클래스"는 것이다. 다른 하나는 동적 메모리가 "수동"이라는 것입니다.

두 번째 점은 new에 전화 할 때마다 누구와 언제 delete을 부를지 생각해야한다는 것입니다.

첫 번째 지점부터 vectorstring은 값으로 동작하며 확장 및 축소를 처리하는 데 필요한 동적 메모리는 클래스 자체에서 관리됩니다. 동적으로 할당 할 필요가 없습니다.

클래스가 선언 된 헤더 (사용 된 경우 #include d 여야 함)와 사용하는 선언이 포함 된 네임 스페이스 (예 : using을 선언하거나이를 명시 적으로 호출)를 처리해야합니다.

다음 코드는 당신이 원하는 무엇을 (하나의 파일에)한다.

#include <vector> 
#include <string> 
#include <iostream> 

class test 
{ 
public: 
    void add(std::string t); 
    void print() const; 
private: 
    typedef std::vector<std::string> data_t; 
    data_t data; 
}; 

void test::add(std::string t) 
{ data.push_back(t); } 

void test::print() const 
{ 
    for(data_t::size_type i=0; i<data.size(); ++i) 
     std::cout << data[i] << std::endl; 
} 

int main() 
{ 
    test a; 
    a.add("first"); 
    a.add("second"); 
    a.add("third"); 
    a.print(); 
    return 0; 
} 

은 (출력 스트림을 parametrising 및 "A"다른 통상의 값으로 대하는 < < 연산자 과부하함으로써)을 인쇄 처리하기 canonical 이상의 방법이있다. 하지만 지금은이 코드 (귀하의 코드와 가장 유사한 코드)를 귀하의 코드와 비교하고 구문 적으로 다른 것이 아닌 코드를 찾으십시오.

편집 여기에 두 가지 향상이 있습니다 C++ (11) 여부를 ... 사용하는 경우 나도 몰라

: C++ 03에 붙어있는 경우

C++ 11을 사용하는 경우 당신이 그것을 밀어주고 나서 더 이상 t을 필요로하지 않기 때문에

void add(sd::string t) 더 나은,

void add(const std::string& t) 
//  ^^^^^   ^

로 parametrised 할 모시 _back,
void test::add(std::string t) 
{ data.push_back(std::move(t)); } 

이 경우

const&를 사용하지 않습니다.

+0

저는 새로운 C++ 프로그래머를 모든 종류의 표준적인 것들로 압도하지 않겠다고 말하고 싶습니다. 그가하려는 일은 Java와 거의 비슷한 코드에서 쉽게 구현 될 수 있습니다. – Daniel

+0

예,하지만 ... 그건 C++가 아닙니다. 우리가 포인터를 사용하고 new/delete를하면 copy, move, assign으로 할 일을 결정해야한다 (다른 객체간에 데이터를 공유해야 하는가 그렇지 않은가? 그리고 어떻게?) Java는 이러한 딜레마를 부과하지 않습니다. 클래스는 모두 참조 (따라서 공유)됩니다. C#을 사용하면 처음부터 결정할 수 있습니다 (클래스 또는 구조체이므로 반 중간에 없습니다). 이 문제를 해결하면 Jav-ize C++이 될 수 있으며 (C++에서는 관리하지 않으므로 메모리 누수가 발생합니다) 하지만 Java와 같은 C++, IMHO를 원한다면 Java를 사용하는 것이 좋습니다. –

+0

놀라운 의견입니다. 추신 : 쉬운 일이 아니길 바래요. 올바른 방법으로 배우고 싶습니다. (메모리 누출 없음) 나는이 솔루션을 사용했고, 이제는 고마워합니다. – user952725

0

나는 또한 포인터를 잃고, 모든 new

관련 문제