2013-03-26 10 views
7

私はc++を初めて使用しています。コンストラクタやクラスに問題があります。"test *"から "test"コンストラクタに変換するコンストラクタはありません

#pragma once 
#include <string> 
using namespace std; 
class test 
{ 

    private: 
    string name; 
    int number; 

public: 

    test(); 
    test(string i,int b); 
}; 

これはcppのファイル::だから、ここに私のヘッダファイルである私は

test t=new test("rrr",8); 

を呼び出すしようとすると、今

#include "test.h" 
#include <string> 
using namespace std; 


test::test(){} 

test::test(string i,int b){ 
    this->name=i; 
    this->number=b; 
} 

私が取得:

1 IntelliSense: no suitable constructor exists to convert from "test *" to "test" 

これは、クラスがのものは何ですか?それらの名前に0(例えば、.cppファイルのないクラスはアスタリスクを持っていません。そして私は何が間違っていますか?

答えて

21

あなたはJava/C#の背景から来ていると思います。 tはここでは参照型ではなく、値型です。 newはオブジェクトへのポインタを返します。したがって、次のいずれかが必要です:

test t = test("rrr", 8); 
test t("rrr", 8); 
test *t = new test("rrr", 8); 

ポインタに慣れていない場合は、間違いなく最後のものを使用しないでください。しかし、ポインタの意味を理解することは非常に重要です。

test* t=new test("rrr",8); 

それとも

test t = test("rrr",8); 
+0

ニース、あなたの答えは私よりもはるかに優れています。+1 –

+0

tnxたくさんあります。私はjavaとC#でプログラミングをしていましたので、C++で苦労しています:) – klo

+0

@klo JavaをプログラミングしたようにC++をプログラミングしようとすると、間違いが発生します。彼らはあまりよく似ていません。 – john

2
test t=new test("rrr",8); 

名前に持つクラスを持つもの "*" は

*がポインタを示すために使用されていただきましたので

// v 
test* t=new test("rrr",8); 

、でなければならない、それはですクラスの名前ではありません。しかし、それは大きな話題なので、これについていくつかの調査をすべきです。

0

あなたはポインタとしてtを定義していませんでした...あなたの教科書の該当する章(複数可)を読んでお勧めしますこのオブジェクト構成で使用される場合、ポインタの作成を示します。何をしているのかは、あなたがするつもりはないと確信しているメモリを動的に割り当てることです。むしろ、典型的なスタックが割り当てられたオブジェクトの構造は次のように単純に行われます。

T t; 

あなたがポインタを作成し、メモリを割り当てるには意図していた場合でも、あなたはそれが間違った方法でした。あなたのコードでは欠けていた*シンボルでポインタが作成されます。第二に、あなたが作成したメモリを使い終わったら、delete/delete[]あなたのコードを覚えておく必要があります。 delete[]は、動的に割り当てられた配列で使用されます。だから、これはそれがあなたのポインタにどのように見えるかです:

delete t; 
0
T* t = new T; 
//  ^^^ 

が新しいです:私は

1

*は、名前の一部ではない、それは、オブジェクトがポインタであることを、示す修飾子です。ポインタは、実際のオブジェクトが格納されているメモリ内のある場所へのアドレスを保持する変数です。いくつかの基本:あなたはint型が保持されているメモリに配置するポインタを宣言したい

int i = 5; 
int * pI = &i; 

int * pI手段、。 &iは、変数へのポインタを取得することを意味します。だから、pIは私が格納されているメモリ内のアドレスを保持します。今、あなたは間接参照ポインタすることができます - ポインタの値を取得:

int j = *pI; 

今、あなたはそれがのpIによって指されたアドレスにアクセスして、PIがポインタであるので、(その内容を盗ん必要があることを、コンパイラに伝えますintには、コンパイラが想定しているように、そこにはintがあります)。

今、あなたの例に戻ってください。 newオペレータので、オブジェクトのメモリを動的に割り当てる:試験クラスのためのメモリを割り当てることで

new test("rrr", 8); 

結果を、パラメータ「RRR」と8と割り当てられたメモリへのポインタを返すとのコンストラクタを呼び出します。そのため、test変数に割り当てることができません。この場合new演算子はtest *を返します。

このコード試してみてください:自分の名前に「*」を持つクラスを持つ事が(例えば、.cppファイルのないクラスは、すべての他の人が行う、アスタリスクを持っていけない)いただきました、だから、

test * t = new test("rrr", 8); 
5

を?? ?

あなたは間違いなくポインタについて学ぶ必要があります。 test *testは、C++ではまったく異なる2つのタイプです。ここではこれらの型を持つ2つの変数です:

test t; 
test* p; 

はここで、tはタイプtest*としてtest、およびpを入力しています。 「testへのポインタ」としてtest*と記載します。

ポインタはオブジェクトのメモリアドレスと考えることがよくあります。だから、pでは、それはポインタなので、というメモリアドレスを格納することができました。これはtestです。 ttestオブジェクトであることを

test t; 
test* p = &t; 

注:オブジェクトのアドレスを取得するには、我々はそうのような単項&演算子を使用します。 new test()と言う必要はありませんでした。これは、C++とC#やJavaのような、あなたが使用していたかもしれない他の言語とは異なるところです。上記のC++コードでは、ttestオブジェクトです。

new test()でオブジェクトを作成すると、違いは何ですか?

test t;は、自動保存期間を持つtestオブジェクトを作成します。これは、スコープの終わりに破壊されることを意味します(しばしば関数が宣言されています)。

new test()は、動的記憶期間を持つtestオブジェクトを作成します。つまり、オブジェクトを手動で破棄する必要があります。そうしないと、メモリリークが発生します。この式はポインタを返しますので、あなたはそれでポインタオブジェクトを初期化することができます

test* p = new test(); 

だから今のあなたの問題を見てみましょう:

test t=new test("rrr",8); 

我々は今new test("rrr", 8)test(Aへのポインタを返すことを知っていますtest*)。ただし、オブジェクトをtestオブジェクトに割り当てようとしています。あなたは単にこれを行うことはできません。そのうちの1つはアドレスであり、もう1つはtestです。したがって、コンパイラには「test *からtestに変換するコンストラクタはありません」と表示されます。今は意味をなさないのですか?

代わりに、自動保存期間を使用することをお勧めします。あなたが本当に必要な場合にのみ、newを使用してください。そうすれば、

test t("rrr", 8); 
関連する問題