Hi Ned.
The generated C++ class does not have an explicit constructor, as you've
pointed out. This is by design. the fields in the DDL class definition
become private members of the C++ class. It is expected that you assign
values to each one of them separately, rather than through a constructor.
There are explicit setters for basic types such as bools or ints. However,
for strings, you get a reference to the private string member variable
(using a getter) and then set it. So, in your example, you could do
something like this:
Text t = new Text();
t.getText().assign("whatever value you want"); // assign a value to the
'text' field
Suppose your class Text had an additional bool parameter:
module io {
class Text {
ustring text;
boolean b;
}
}
There'd be a setter for 'b' in the generated C++ class, and you'd do
something like:
Text t = new Text();
t.setB(true);
It's only for the more complex types (strings, maps, vectors) that you don't
have explicit setters. You use a getter to get a reference object to the
member variable, then assign values to it.
AFAIK, the C++ generated classes are not broken. They're a bit different
from the Java classes, which have setters for each field (and you could
discus whether the C++ and Java classes should look more like each other),
but they work.
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Ned
Rockson
Sent: Thursday, January 10, 2008 1:34 AM
To: [email protected]
Subject: Problem with autogenerated C++ Records using bin/rcc
Recently I've been trying to autogenerate some data structures that will
work for both C++ and Java. I've made many that work with Java, but every
time I try to generate one for C++ the generator breaks down. For instance,
I was trying to create a Text class for C++, so I created a text.jr:
module io {
class Text {
ustring text;
}
}
that in Java works fine, but in C++, this is generated (implementation is
fine for the methods defined):
#ifndef __TEXT_DDL__
#define __TEXT_DDL__
#include "recordio.hh"
namespace io {
class Text : public ::hadoop::Record {
private:
::std::string text;
public:
virtual void serialize(::hadoop::OArchive& a_, const char* tag) const;
virtual void deserialize(::hadoop::IArchive& a_, const char* tag);
virtual const ::std::string& type() const;
virtual const ::std::string& signature() const;
virtual bool operator<(const Text& peer_) const;
virtual bool operator==(const Text& peer_) const;
virtual ~Text() {};
virtual const ::std::string& getText() const {
return text;
}
virtual ::std::string& getText() {
return text;
}
}; // end record Text
} // end namespace io
#endif //TEXT_DDL__
What is obviously missing is
-a constructor,
-a setter (there are getters for const and non-const...)
This is with hadoop-0.15.1 and I've also tried following the examples given
in the API to no luck. Thanks for any feedback!