473,385 Members | 1,863 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

How to return an array of own datatype

Hello (and a happy new year)

I'm quite new to C++ and have to programm something for school and can't
get my head around
a couple of things, but at the moment this one is the most important for me:

I have defined a class String and before I go on I should mention that
I'm not allowed to use any pre-defined templates (no STL) and not the
standard C++ String class, kind of mean :)

Nevertheless I want to tokenize a String with a predefined delimiter,
which will be used later to
cut words out of a sentence.

String.cpp

String[] String::tokenize(const String s, char* delimiter)
{
String stringArray[];
// tokenize the String and put each word into the String array
...

return stringArray;
}
String.h

String[] tokenize(const String s, char* delimiters);
My first problem is that I get a bunch of errors for the header line
(the first is C3409, I'm using VC++ .NET),
I assume this is not the way how one should define an array return type?
I know I have a second problem too, because I have to define the size
of the array I want to return, but honestly I want to avoid that, I
would love to do that dynamicly
as in a Vector.

Jul 22 '05 #1
9 2347
On Sun, 02 Jan 2005 11:12:07 +0100 in comp.lang.c++, Steve
<s.*******@fhtw-berlin.de> wrote,
String[] tokenize(const String s, char* delimiters);


An array return type is not allowed.

You can return a struct that contains an array. Or you can let the
caller provide a pointer to an array argument that you fill with
your results. You can return a pointer to an array that you got
somewhere, but that means you have to pay more attention to where
the array is allocated.

Jul 22 '05 #2
David Harmon wrote:
On Sun, 02 Jan 2005 11:12:07 +0100 in comp.lang.c++, Steve
<s.*******@fhtw-berlin.de> wrote,
String[] tokenize(const String s, char* delimiters);

An array return type is not allowed.

Ohhh, ok didn't know that!
You can return a struct that contains an array. Or you can let the
caller provide a pointer to an array argument that you fill with
your results. You can return a pointer to an array that you got
somewhere, but that means you have to pay more attention to where
the array is allocated.


Thanks, I will give the struct idea a try.

cheers
Steve

Jul 22 '05 #3
"Steve" <s.*******@fhtw-berlin.de> wrote in message news:33*************@news.dfncis.de...
David Harmon wrote:
On Sun, 02 Jan 2005 11:12:07 +0100 in comp.lang.c++, Steve
<s.*******@fhtw-berlin.de> wrote,
String[] tokenize(const String s, char* delimiters);

An array return type is not allowed.

Ohhh, ok didn't know that!

You can return a struct that contains an array. Or you can let the
caller provide a pointer to an array argument that you fill with
your results. You can return a pointer to an array that you got
somewhere, but that means you have to pay more attention to where
the array is allocated.


Thanks, I will give the struct idea a try.

Most time, return a struct is not a good idea. This cause a copy operation of
the members in the struct.
cheers
Steve

Jul 22 '05 #4


String.cpp

std::vector<String> String[] String::tokenize(const String s, char* delimiter)
{
std::vector<String> stringArray;
// tokenize the String and put each word into the String array
...

return stringArray;
}
OK?
But a little slow.

--

---http://snnn.blogone.net-----
Jul 22 '05 #5
"Mole Wang" <mo****@yahoo.com.cn> writes:

Most time, return a struct is not a good idea. This cause a copy operation of
the members in the struct.

Or return a std::SmartPtr allocated by the function ?

Who should own it?
Who should allocate it?
Who should free it?

Pointers bring too trouble to it.

--
---------------snnn-------------
---http://snnn.blogone.net-----
Jul 22 '05 #6
"cyper" <cy***@163.com.haha.removeme> a écrit dans le message de news:
u1***********@163.com.haha.removeme...
"Mole Wang" <mo****@yahoo.com.cn> writes:

Most time, return a struct is not a good idea. This cause a copy operation
of
the members in the struct.

Or return a std::SmartPtr allocated by the function ?

Who should own it?
Who should allocate it?
Who should free it?


Depending on the design, receiving a reference to an object for modification
can be more "efficient" than returning it. The thing is, modifying
parameters received by reference is usually dangerous, since it is not
always clear that the function will modify it. I prefer passing by address
when my functions modify their arguments.

void f(A &a);
void g(A *a);

int main()
{
A a;

f(a); // watch out, f() modifies a
g(&a); // that's clearer (imho)
}

Except for specific cases, I prefer returning by value since it is the
clearest way and users can safely ignore the modifications.
Jonathan
Jul 22 '05 #7

"cyper" <cy***@163.com.haha.removeme> wrote in message
news:u6***********@163.com.haha.removeme...


String.cpp

std::vector<String> String[] String::tokenize(const String s, char* delimiter) {
std::vector<String> stringArray;
// tokenize the String and put each word into the String array
...

return stringArray;
}
OK?
But a little slow.


Did you try to compile that?

-Mike
Jul 22 '05 #8
Steve wrote:
Hello (and a happy new year)

I'm quite new to C++ and have to programm something for school and can't
get my head around
a couple of things, but at the moment this one is the most important for
me:

I have defined a class String and before I go on I should mention that
I'm not allowed to use any pre-defined templates (no STL) and not the
standard C++ String class, kind of mean :)

Nevertheless I want to tokenize a String with a predefined delimiter,
which will be used later to
cut words out of a sentence.

String.cpp

String[] String::tokenize(const String s, char* delimiter)

From a design perspective , the String argument to the function,
seems a little bit unconventional and confusing, since it is not
clear why this ought to be a member function since you are
passing a String and a delimiter as argument to the function.
(well, then you can as well have this method as static, which
may not be the best design though ).

Some suggestions:

1. You can have a method as follows.

vector<String> String::tokenize(const char * delimiter)
//Tokenize the String object's contents' here.
2. A better way would be to have a StringTokenizer class.
vector<String> StringTokenizer::tokenize(const char * delimiter);
--
Karthik.
Jul 22 '05 #9
Steve wrote:
String[] String::tokenize(const String s, char* delimiter)
{
String stringArray[];
// tokenize the String and put each word into the String array
...

return stringArray;
}
The typical C++ approach to this is to have the function take an output
iterator which is written to in the function, i.e. something like this:

| template <typename OutIt>
| OutIt String::tokenize(char const* delimiters, OutIt to)
| {
| // ...
| *to++ = token;
| // ...
| return to;
| }

You could then use your 'tokenize()' function something like this:

| std::vector<String> vec;
| String str(/*...*/);
| str.tokenize(",", std::back_inserter(vec));

.... or use whatever appropriate container type you wish instead of
'std::vector' as long as it supports a 'push_back()' operation. This
also
allows output e.g. to standard output using an appropriate iteartor:

| str.tokenize(',', std::ostream_iterator<String>(std::cout, "\n"));

The trouble is somewhat that your teacher apparently does not
understand
how C++ works and deprived you from reasonable use of the standard
library
thereby either forcing you to reimplement fairly large portions thereof
or
using inferior programming techniques. If he wanted you to provide an
implementation of some particular algorithms without using the
corresponding
algorithms from the standard library he should have specified it that
way
rather.
String[] tokenize(const String s, char* delimiters);
This is illegal syntax. If it were possible to return an array from a
function, the syntax would rather be something like this:

| String (tokenize(String const&s, char const* delimiters))[10];

A declaration like this should give an error message similar to the one
issued e.g. by SUN's compiler:

| Error: Functions cannot return arrays or functions.

However, please note two other important changes I applied to the
function
signature:
- The string is taken as reference argument: there is probably no need
to
copy the String, especially if you want it to be 'const' anyway.
- To allow passing of string literals to the functions, the second
parameter uses a pointer to 'char const' (i.e. an array of constant
'char's; 'char const' and 'const char' is equivalent but I consider
it
to be easier to read to place the 'const' as far to the right as
possible).
My first problem is that I get a bunch of errors for the header line
(the first is C3409, I'm using VC++ .NET),
I assume this is not the way how one should define an array return type?

Right. See above.
I know I have a second problem too, because I have to define the size
of the array I want to return, but honestly I want to avoid that, I
would love to do that dynamicly
as in a Vector.


To do so, you need to handle dynamic memory allocation - or,
preferably,
use one of the standard containers. Proper implementation of a
container
is actually non-trivial and involves loads of intrinsic little nits
which
are, IMO, far beyond a typical school assignment level. For example,
reasonable implementation of a 'std::vector' replacement involves
allocation
of uninitialized memory and placement construction/destruction of
elements.
No real rocket science but hardly what students need to be exposed to
learn
dealing with data structures either. Of course, some issues can be side
stepped by default constructing a bigger array and only considering a
subset
of the actual elements to be present in the vector...
--
<mailto:di***********@yahoo.com> <http://www.dietmar-kuehl.de/>
<http://www.contendix.com> - Software Development & Consulting

Jul 22 '05 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: Phil Powell | last post by:
if (is_array($_POST)) { foreach ($this->getAssocSectionsObjArray($key, $dbAP) as $obj) { print_r($obj); print_r(" in array? "); print_r(in_array($obj, $result)); print_r("<P>"); if...
1
by: OlgaM | last post by:
Hello, i'm trying to initialize an array. The class List contains this in its private data members: ListNode<DATATYPE> *dataItems; In the constructor, i'm trying to allocate space for...
1
by: Raptor | last post by:
Hi, I'm quite new to MySQL and quite impressed by its feature set. I've also been looking at Interbase and it has a feature that allows a multidimensional array to be stored in a single field. ...
11
by: Magix | last post by:
Hi, what is wrong with following code ? typedef struct { word payLen; datatype data; } msg_type;
7
by: nafri | last post by:
hello all, I want to create a function that returns the first element of the Array that is input to it. However, the Input Array can be an Array of points, double, or anyother type, which means...
6
by: Andrew | last post by:
Hi all, I have a method that wants to return an array. What datatype should I use ? I tried using an "Array" but there was a compilation error. Why ? public Array setReviewAll2 (int intNumQn)...
0
by: DWalker | last post by:
VBA, as used in Excel 2000 and Excel 2003, has a function called Array. It's commonly seen in statements like the following: Workbooks.OpenText Filename:=ACFileName, _ StartRow:=1,...
0
by: rascal_mon | last post by:
I'm new with XML. Please give me some advice. I wonder there are any difference between XML that is automatically generated from ADO and XML file that shows in many textbooks. I found that the...
8
by: Tom | last post by:
Is there a function to get a variable to return its name w/datatype of string? i.e.: $var would return "var"
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.