0

ここに私の問題があります。

char* を定期的に変更するクラスがあります。

この値を読み取ることができる必要がある別のクラスがあります。したがって、必要に応じて値をチェックできるように、この 2 番目のクラスのコンストラクターに char* を渡したいと思います。

別のパラメーターの実装の例を挙げましょう。これはブール型です。

クラスA:

bool f_valid = false; // global

m_eventCatcher.addProxy(porting::shared_ptr<CallbackProxy>(new handleCall(&f_valid))); 

クラス B では:

struct handleCall 
{
    bool* m_dataValid;

    handleCall(bool* result) 
    {
        // saving the pointer to the boolean that I want to change
        m_dataValid = result; 
    }

    method()
    {
        if (smth) 
        { 
            (*m_dataValid) = false;
        }
    }
};

これまでのところうまくいっています - これはうまくいくようです。どちらのクラスも、このブール値を変更してアクセスできます。

ここで、char* を使用して同じことを行う必要があります (文字列を使用できないため、URL アドレスなどの短いテキストを保存するには、これが最善の方法だと思いますか?)。

だからここに私が書いたものがあります:

クラスA:

const char* f_url = "blah blah"; // global

m_eventCatcher.addProxy(porting::shared_ptr<CallbackProxy>(new handleCall2(&f_url)));

クラスC:

struct handleCall2 
{
    char ** m_url;

    handleCall2(char** url)
    {
        // saving the pointer to the char*
        m_url= url;
        std::cout << (*m_url) << std::endl; // prints out url fine
    }

    method() 
   {
        std::cout << (*m_url) << std::endl; // by this time the value has been changed by ClassA, and I print out some rubbish - symbols, squares, etc.
    }
};

問題は、文字列が変更され、そのアドレスも変更されたためだと思いますか? 私は本当に混乱しています - 誰かが何が起こっているのか教えてもらえますか? この状況で私は何をすべきですか?

アップデート:

問題はchar *を変更する方法にあるようです:

f_url = "new text"; // works fine

f_url = fileUrl.c_str(); // doesn't work! I get rubbish in the value when I try to access it from ClassB

strcpy(m_url, fileUrl.c_str()); // I also removed const from the variable and tried this - got a crash "access violation using location" :(

文字列の値を char * に書き込む他の方法はありますか?

4

5 に答える 5

0
const char* f_url = "blah blah"; // global

たぶん、あなたはこの行を誤解していますか?const 修飾子は、配置するときに、その左側のキーワードを参照します。それを最初のキーワードとして使用することは許可されていますが、その場合にのみ、その権利を参照しています;) したがって、宣言は次のように述べています: (const char) *f_url したがって、const char へのポインターです。そして、私は推測しています(そのクラスの値をどのように変更しているのかわかりません)、自分でそれを取得します.const char値を変更すると、ごみの出力になる可能性がありますね. 次のように宣言することをお勧めします

char *const f_url = "blah blah";

これは

char (* const) f_url

したがって、f_url は、変更可能な領域を指している定数のアドレス値です。しかし、「何とか何とか」は const メモリ領域のアドレスであるため、これでもあまり意味がありません。とりあえず。

だからあなたはただやるべきです

char *const f_url = ThisIsACharArray[count];

f_url に関する char 配列、別名 String にアクセスします。

または、私が推測するように、constを宣言から除外し、自分で変更可能なメモリを割り当てるだけです;)

于 2013-08-10T01:39:53.977 に答える
0

へのアクセスに問題はありませんchar *

サンプルコードを書きましたが、うまくいきました。あなたの問題は別の問題かもしれません:

ところで、ここに参考用の私のコードがあります:

#include <iostream>

class ClassThatPrints
{
private:
    const char **m_url;

public:
    ClassThatPrints(const char ** url)
    {
        m_url = url;
        std::cout << (*m_url) << std::endl;
    }

    void PrintAfterModify(void)
    {
        std::cout << (*m_url) << std::endl;
    }
};

class ClassThatModifies
{
private:
    const char *m_charPointer;
    ClassThatPrints *m_ClassThatPrints;
public:
    ClassThatModifies()
    {
        m_charPointer = "this is the original string";
        std::cout << "Printing before modification:" << std::endl;
        m_ClassThatPrints = new ClassThatPrints(&m_charPointer);
    }

    ~ClassThatModifies() {
        delete m_ClassThatPrints;
    }

    void ModifyStringAndPrint(void)
    {
        m_charPointer = "this is a modified string";
        std::cout << "Printing after modification:" << std::endl;
        m_ClassThatPrints->PrintAfterModify();
    }
};

int main()
{
    ClassThatModifies objClassThatModifies;
    objClassThatModifies.ModifyStringAndPrint();

}
于 2013-08-09T12:12:54.667 に答える
0

このようなものがある場合:

void addHandler() {
    const char* f_url = "blah blah";
    m_eventCatcher.addProxy(porting::shared_ptr<CallbackProxy>(new handleCall2(&f_url)));
}

void doStuff() {
    addHandler();
    m_eventCatcher.callProxy();
}

問題は、addHandler が返されたときに f_url が範囲外であることです。この場合、bool バージョンにも問題があり、(*m_dataValid) = false;他のデータを上書きしています。

于 2013-08-09T12:31:01.947 に答える