표현식에는 클래스 유형이 있어야합니다.
나는 한동안 C ++로 코딩하지 않았고이 간단한 스 니펫을 컴파일하려고 할 때 막혔습니다.
class A
{
public:
void f() {}
};
int main()
{
{
A a;
a.f(); // works fine
}
{
A *a = new A();
a.f(); // this doesn't
}
}
포인터이므로 대신 시도하십시오.
a->f();
기본적으로 연산자 .
(객체의 필드 및 메서드에 액세스하는 데 사용됨)는 객체 및 참조에 사용됩니다.
A a;
a.f();
A& ref = a;
ref.f();
포인터 유형이있는 경우 참조를 얻으려면 먼저 참조를 역 참조해야합니다.
A* ptr = new A();
(*ptr).f();
ptr->f();
a->b
표기는 일반적으로 단지 속기이다 (*a).b
.
스마트 포인터에 대한 참고 사항
는 operator->
오버로드 될 수 있으며, 특히 스마트 포인터에서 사용됩니다. 때 당신이 스마트 포인터를 사용하고 , 당신은 또한 사용 ->
뾰족한 물체를 참조 :
auto ptr = make_unique<A>();
ptr->f();
분석을 허용하십시오.
#include <iostream> // not #include "iostream"
using namespace std; // in this case okay, but never do that in header files
class A
{
public:
void f() { cout<<"f()\n"; }
};
int main()
{
/*
// A a; //this works
A *a = new A(); //this doesn't
a.f(); // "f has not been declared"
*/ // below
// system("pause"); <-- Don't do this. It is non-portable code. I guess your
// teacher told you this?
// Better: In your IDE there is prolly an option somewhere
// to not close the terminal/console-window.
// If you compile on a CLI, it is not needed at all.
}
일반적인 조언 :
0) Prefer automatic variables
int a;
MyClass myInstance;
std::vector<int> myIntVector;
1) If you need data sharing on big objects down
the call hierarchy, prefer references:
void foo (std::vector<int> const &input) {...}
void bar () {
std::vector<int> something;
...
foo (something);
}
2) If you need data sharing up the call hierarchy, prefer smart-pointers
that automatically manage deletion and reference counting.
3) If you need an array, use std::vector<> instead in most cases.
std::vector<> is ought to be the one default container.
4) I've yet to find a good reason for blank pointers.
-> Hard to get right exception safe
class Foo {
Foo () : a(new int[512]), b(new int[512]) {}
~Foo() {
delete [] b;
delete [] a;
}
};
-> if the second new[] fails, Foo leaks memory, because the
destructor is never called. Avoid this easily by using
one of the standard containers, like std::vector, or
smart-pointers.
As a rule of thumb: If you need to manage memory on your own, there is generally a superiour manager or alternative available already, one that follows the RAII principle.
Summary: Instead of a.f();
it should be a->f();
In main you have defined a as a pointer to object of A, so you can access functions using the ->
operator.
An alternate, but less readable way is (*a).f()
a.f()
could have been used to access f(), if a was declared as: A a;
a
is a pointer. You need to use->
, not .
참고URL : https://stackoverflow.com/questions/6547602/expression-must-have-class-type
'Nice programing' 카테고리의 다른 글
IComparable 인터페이스를 구현하는 방법은 무엇입니까? (0) | 2020.11.03 |
---|---|
Android 에뮬레이터에서 파일 시스템의 로컬 파일에 액세스하는 방법은 무엇입니까? (0) | 2020.11.03 |
zend 프레임 워크에서 정확한 SQL 쿼리를 인쇄하는 방법은 무엇입니까? (0) | 2020.11.03 |
DateTime에 PHP 타임 스탬프 (0) | 2020.11.03 |
다른 함수를 반환하는 함수를 어떻게 작성합니까? (0) | 2020.11.03 |