2016-08-12 4 views
1

이것은 아마도 간단한 질문 일 뿐이지 만이를 해결하는 좋은 방법은 없습니다. 내가 인스턴스의 시리즈를 구성하려는런타임 중에 'const'매개 변수를 사용하여 클래스를 생성하십시오.

MyClass(const double value); 

문제 되나 전달 된 값은 할 수있다 : I는 다음과 같은 생성자의 매개 변수로 const를 더블을 필요로하는 클래스를,이 API를 사용하고 있습니다 런타임 중에 알려진.

더 명확하게, 여기에 내가 무엇을했는지 있습니다 :

.H 파일 실행시

std::vector<MyClass> my_class_vec; 
std::vector<double> my_value_vec 

, 나는 값이 my_value_vec을 할당 할 수 있습니다. 나는 my_class_vec 구성하기 위해이 값을 사용하려면 :

.cpp 파일을

for(int i = 0; i < my_value_vec.size(); i++) 
    my_class_vec(my_value_vec[i]); 

나는 const를 더블 매개 변수로 더블을 통과 할 수 없기 때문에 나는이 잘못 알고 . 그리고 인스턴스 구축시 잘못된 사용법도 있지만, 원하는대로 할 수있는 좋은 방법을 찾을 수 없습니다. 누구든지 아이디어가 있습니까? 당신의 의견에 진심으로 감사드립니다.

+0

"* 왜냐하면 double을 const double 매개 변수로 전달할 수 없기 때문입니다. *"... 왜 안 되니? 또는 더 중요한 것은 코드가 컴파일되지 않는 이유와 아무 관련이 없습니다. –

+0

감사합니다. @ Nicol Bolas! – Willie

답변

0

이 잘못이지만, 대한 완전히 다른 이유. 처음에는 doubleconst double parameter으로 전달할 수 있습니다.

void foo(const double b) 
{ 
} 

double c; 

void bar() 
{ 
    foo(c); 
} 

이 문제는 아무런 문제없이 컴파일됩니다. const이 지정하는 유일한 경우, 이 경우은 해당 함수 foo()이 해당 매개 변수를 수정할 수 없다는 것입니다. 그게 전부 야. 전달 된 값이 일정하거나 변경 가능한지에 상관없이 아무 관련이 없습니다. 호출자는 double 또는 const double을 매개 변수로 자유롭게 전달할 수 있습니다. 이 매개 변수는 값에 의해 전달됩니다. 이것은 매개 변수의 복사본이 모든 경우에 호출 된 함수에 대해 만들어 짐을 의미합니다. 복사본은 double 또는 const double에서 올 수 있습니다. 아무런 차이가 없습니다.

귀하의 문제는 완전히 다릅니다. 벡터를 구성하려는 시도는 근본적으로 잘못되었습니다 .1 잘못된 것입니다.

std::vector<MyClass> my_class_vec; 
std::vector<double> my_value_vec; 

my_class_vec은 벡터입니다.

my_class_vec(my_value_vec[i]); 

std::vector 여기에 호출되는 operator()를 구현하지 않는 단순한 이유에 대해 컴파일되지 않습니다. my_class_vec(something)은 벡터에 아무 것도 추가하지 않습니다. 그런 건 없어요. 이것은 아무것도 만들지 않습니다. 이렇게하면 operator()이 호출되어 개체에 매개 변수로 double이 전달됩니다. std::vector() 연산자를 구현하지 않으므로 컴파일에 실패합니다.

올바른 방법은 ++ 현대 C를 사용하여, 샘플 벡터를 초기화 :

for (const auto &value:my_value_vec) 
    my_class_vec.emplace_back(value); 

my_class_vec가 비어 있다고 가정합니다. emplace_back()은 벡터의 뒷쪽 끝에 새로운 값을 구성하여 double value을 생성자에 전달합니다. 범위 반복에서 const 한정자와 함께 사용하거나 사용하지 않아도됩니다.

+0

@Sam Varshavchik, 고맙습니다. 이제 클래스 벡터를 만드는 데 잘못된 방법을 사용합니다. 하지만 내 컴파일러는 std :: vector를 보여줍니다. 에는 "emplace_back"이라는 멤버가 없습니다. 나는 무엇이든 놓친다? – Willie

+0

컴파일 할 때 C++ 11을 사용하면 문제가 해결되었습니다. 다시 한 번 감사드립니다! – Willie

0

왜냐하면 double을 const double 매개 변수로 전달할 수 없기 때문입니다.

물론 문제는 아무 문제가 없습니다. 당신이, 당신이 std::vector::emplace_back를 사용할 수 my_value_vec[i]의 값에 따라 my_class_vec에 요소를 추가 할 경우

문제는 약 my_class_vec(my_value_vec[i]);입니다 (이후 C++ 11) :

my_class_vec.emplace_back(my_value_vec[i]); 
+0

@songyuanyao, 문제가 해결되었습니다 감사합니다! – Willie

관련 문제