하나는 C++에있는 모든 클래스가 "값 클래스"는 것이다. 다른 하나는 동적 메모리가 "수동"이라는 것입니다.
두 번째 점은 new
에 전화 할 때마다 누구와 언제 delete
을 부를지 생각해야한다는 것입니다.
첫 번째 지점부터 vector
과 string
은 값으로 동작하며 확장 및 축소를 처리하는 데 필요한 동적 메모리는 클래스 자체에서 관리됩니다. 동적으로 할당 할 필요가 없습니다.
클래스가 선언 된 헤더 (사용 된 경우 #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&
를 사용하지 않습니다.
첫 번째로 만든 개체를 삭제하는 것을 기억하는 것이 중요하다 * 테스트 벡터 포인터가 ::
를 인쇄 당신이 참조를 해제하는 것을 잊었다 생각 스택을 사용하십시오 :'vector data;'. 기본 초기화되고 사용하는 메모리를 확보 할 필요가 없습니다. 둘째, 오류 메시지는 훌륭하지만,'push_back' 대신에'pushback'을 사용하는 것이 좋습니다. –
chris
+1 왜 내가 downvoted 이유 모르겠어요. 이 질문은 잘 표현되어 있지 않지만, 처음에는 낯선 것을 배우는 경우가 무엇인지 물어 보는 것이 어렵고 문제의 90 %를 알기도합니다. 인내심을 갖고 경험이 부족한 사용자를 수용 할 수 있습니다. – gbtimmon
그래서 문제가 무엇입니까? 컴파일 오류? 출력이 예상과 다릅니다. 실제로 당신은 진짜 질문을해야합니다. – betabandido