printf i klasa niestandardowa

Mam własną klasę, która reprezentuje niestandardową klasę ciągów. Używam VS2012RC. Przeładowałem niektórych operatorów mojej klasy CustomString.

Oto kod:

CustomString::CustomString(string setstr)
{           
    str = setstr;
}

CustomString::operator const char *()
{   
    return (this->str.c_str());
}

CustomString &CustomString::operator = (char *setstr)
{
    str = setstr;
    return *this;
}

Mogę zdefiniować mój obiekt i użyć go w ten sposób:

CustomString str = "Test string";

i mogę wydrukować wynik jako:

printf(str);

printf((string)(str).c_str());

printf((string)(str).data());

printf("%s\n",(string)(str).c_str());

printf("%s\n",(string)(str).data());

I nie ma żadnego błędu.

Ale jeśli użyję tego w ten sposób:

printf("%s\n", str);

Wyjątek w msvcr110d.dll (błąd dostępu do pamięci)

Czemuprintf (str) jest ok, aleprintf ("% s n", str) nie jest ok?

Jak mogę zmodyfikować mój kod do użyciaprintf ("% s n", str) ?

...

Po godzinach googlingu odkryłem, że metoda explict cast (string), static_cast (str) i _str () dodaje znaki zakończone znakiem null: '0';

zmodyfikowałem mój kod jako:

printf("%s\n",str + '\0');

i to zadziałało!

Czy istnieje sposób na zmodyfikowanie mojego niestandardowego konstruktora, aby dodać łańcuch zakończony znakiem NULL i przekazać poprawną wartość za pomocą znaków zakończonych znakiem null, aby uzyskać następujący kod:

printf("%s\n",str);

questionAnswers(4)

yourAnswerToTheQuestion