문제

C #에서 주로 개발하고있는 C ++ 개발은 C ++ 언어를 완전히 활용하지 못했습니다. 나는 이제는 의도 된 언어를 사용하려고 노력하고 있으며, 통과 된 논쟁에서 const 선언으로 머리카락을 꺼내고 있습니다. 과거에는 나는 그들을 사용하지 않았거나 방해를 해킹하여 STL로 일하게 만듭니다.

함수에서 o를 읽는 것으로 사용하려고 할 때 다음 함수를 만들 것입니다.

void foo(const MyClass* o);
.

여기서 내 문제가 있습니다 ... 코드 첫째 :

#include <iostream>
#include <string>

using namespace std;

///////////////////////////////////////////////////////////
// Classes are defined in the one file for an easy post.

///////////////////////////////////////////////////////////

class ClassA {
private: // member variables
    string m_name;

public: // constructors
    ClassA(const string& name = "") : m_name{name} {}
    virtual ~ClassA() { }

public: // accessors
    const string& name() const { return m_name; }
    void setName(const string& value) { m_name = value; }   
};

class ClassB {
private: // member variables
    string m_name;
    ClassA m_child;

public: // constructors
    ClassB(const string& name = "") : m_name{name} {}
    virtual ~ClassB() { }

public: // accessors
    const string& name() const { return m_name; }
    void setName(const string& value) { m_name = value; }

    ClassA* child() { return &m_child; }
    void setChild(const ClassA* value) { m_child = *value; }
};

///////////////////////////////////////////////////////////
// Protoptypes are not used to save space for the post.

void doSomethingA(const ClassA* o) {
   cout << "name = " << o->name() << endl << endl;
}

void doSomethingB(const ClassB* o) {
   cout << "name = " << o->name() << endl << endl;
   doSomethingA(o->child());
}

///////////////////////////////////////////////////////////

int main(int argc, char** argv) {
    ClassA a { "My Class A" };
    ClassB b { "My Class B" };


    b.setChild(&a);
    b.child()->setName("My New Name");
    doSomethingB(&b);
    return 0;
}
.

main () dosomethingb의 컴파일러 (G ++ 버전 4.7.2) 의음 :

doSomethingA(o->child());
.

오류가 있습니다 : 'classa * classb :: child ()'의 'this'인수를 'const classb'라는 이름으로 전달하십시오.

이제는 포인터로 작동하도록 내 수업을 전달하고 있습니다. 참조 / 포인터 옵션에 문제가 있기 때문에 항상 포인터를 사용하여 항상 사용을 계획합니다. 나는 하나, 포인터를 선택하고 그것으로 고집하고 있습니다. 그래서 dosomethinga와 dosomethingb 나는 그들의 수업이 변경되지 않는다는 것을 프로그래머에게 말하고 싶습니다. 그러나 때로는 "읽기 전용"과 다른 시간으로 사용하고자하는 child 버전의 child 버전 만 원할 수 있습니다. 내가 이것을 필요로하는 사례). 나는 심지어 시도했다 :

doSomethingA(const_cast<const ClassA*>(o->child()));
.

그러나 그것은 작동하지 않았습니다.

과거에는이 작업과 같은 기능을 만들기 위해 함수의 Const 선언을 제거했지만 이제는 적절한 C ++를 사용하고 싶습니다. 제발 돕는다.

도움이 되었습니까?

해결책

Const 객체에 대해 비 const 함수에 액세스하려고 시도합니다.const 함수를 만들어야합니다.

const ClassA* child() const { return &m_child; }
.

Const 및 Non-Const 버전을 제공 할 수도 있습니다.

ClassA* child() { return &m_child; }
const ClassA* child() const { return &m_child; }
.

이렇게하면 비 const 객체가있는 경우 ClassA에서 비 const 메소드를 호출 할 수 있습니다.

다른 팁

시도

ClassA* child() const { return &m_child; }
.

또는

const ClassA* child() const { return &m_child; }
.

const 정확도를 유지하려면

또한 NullPtr을 통과하지 않는 한 포인터를 사용할 필요가 없습니다.따라서 다음을 수행 할 수 있습니다.

void doSomethingB(const ClassB& o);

// in class ClassB
const ClassA& child() const { return m_child; }
ClassA& child() { return m_child; }
.

참고 문헌 여전히 포인터와 같은 방식으로 같은 방식입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top