Adott egy egyszerű exception osztály, ami változó hosszúságú argumentumlistát fogad! Úgy szeretném megcsinálni, hogy a user csak a konstruktoron keresztül adhassa ezt át, míg a gyerekosztályok kapnak egy protected setMessage() függvényt. Logikus lenne, ha a konstruktor a setMessage() függvényt hívná, de valamiért ilyenkor lenyelődik, azaz inkább felülíródik az első paraméter értéke.
Mivel a 'C'-s vsnprintf függvény hívása problámamentes, ezért gondolom azzal lehet összefüggésben a dolog, hogy a setMessage 'C++' függvény.
Nos ismeri valaki a 'C++'-os függvények hívási specifikációját, vagy megadhatom e egy osztály memberfüggvényére, hogy extern "C", vagy egyéb
ötlete illetve magyarázata van valakinek? :)Ez a kód:
#include <iostream>
#include <cstdio>
#include <cstdarg>
using namespace std;
#define BUFF_SIZE 1024
class Exception {
public:
Exception(const char *format, ...) {
va_list args;
va_start (args, format);
setMessage(format, args);
va_end (args);
}
const char* getMessage() const {
return message.c_str();
}
//protected:
void setMessage(const char *format, ...) {
char buffer[BUFF_SIZE];
va_list args;
va_start (args, format);
vsnprintf (buffer,BUFF_SIZE, format, args);
va_end (args);
message = std::string(buffer);
}
private:
std::string message;
};
int main(void)
{
try {
throw Exception("1:%s,2:%s,3:%s","1","2","3");
} catch(Exception e) {
cerr << "Exception: " << e.getMessage() << endl;
}
try {
Exception e("");e.setMessage("1:%s,2:%s,3:%s","1","2","3"); throw e;
}
catch(Exception e) {
cerr << "Exception: " << e.getMessage() << endl;
}
}
Ez a kimenet:
Exception: 1:,2:2,3:3
Exception: 1:1,2:2,3:3