Okay I need some help with this
I am trying to figure out how to create a copy constructor with this "webLinsks" class object when it is called it is supposed to produce an array of "webLinks" objects from the 'myWeb' array and put it into 'newWeb' a new "webLinks" array as declared on line 281.
webLinks* myWeb = new webLinks[numSites]();
Here is the code for the copy constructor as on line 306:
webLinks* newWeb = new webLinks(myWeb);
then I have to assign the newWeb object to another newNewWeb object as shown on line 324 :
webLinks* newNewWeb = newWeb; // using overloaded = operator
I am unsure if my overloaded operator is working. I am unsure which way to do it. Here my code for it on lines 186-207:
webLinks* webLinks::operator=(webLinks *WL)
{
    // TODO: insert return statement here
    //URL = WL.URL;//.getURL());
    //URL = new String(URL->getWord());
    URL = new String(WL->URL->getWord());
    numLinks = WL->numLinks;
    hyperLinks = WL->getHyperlinks();
    return WL;
}
webLinks& webLinks::operator=(webLinks &WL)
{
    // TODO: insert return statement here
    //URL = WL.URL;//.getURL());
    //URL = new String(URL->getWord());
    URL = new String(WL.URL->getWord());
    numLinks = WL.numLinks;
    hyperLinks = WL.getHyperlinks();
    return WL;
}
My programm input for terminal (txt file): https://drive.google.com/file/d/1HVESZnIhH16RP3FmKHGMCKHLILbuTOb0/view?usp=sharing
My code:
// links.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
#include <iostream>
using namespace std;
// used to empty a given string A of length n
void emptyString(char* A, int n) {
    for (int i = 0; i < n; i++) {
        A[i] = '\0';
    }
}
// copy a string A to B of length n
void stringCopy(char* A, int n, char* B) {
    for (int i = 0; i < n; i++) {
        B[i] = A[i];
    }
}
// return the length of a given string A
int stringLength(char* A) {
    int size = 0;
    while (A[size] != '\0')
        size++;
    return size; //size is the last index position
}
// get one token from redirected input and return that string (alphanumeric)
char* getNextToken() {
    char* str = new char[25]; //assumes a max token size of 20
    emptyString(str, 25);
    char c;
    int i = 0;
    while (!cin.eof()) {
        cin.get(c);
        if (!cin.eof()) {
            if ((c != '\n') && (c != ' ')) {
                if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || (c == '.'))
                    //|| ((c >= '0') && (c <= '9')))
                    str[i++] = c;
            }
            else if ((c == '\n') && (i > 0))
                return str;
            else if ((c == ' ') && (i > 0))
                return str;
        }
    }
    if (i > 0)
        return str;
    else
        return NULL;
}
class String {
    friend ostream& operator << (ostream& oS, String& s);
    protected:
        char *str;
        int size;
    public:
        
        String();
        String(char* C);
        String(String &S);
        ~String();
        int Size();
        char* getWord();
};
ostream& operator<<(ostream& oS, String& s)
{
    // TODO: insert return statement here
    oS << s.str;
    return oS;
}
String::String()
{
    str = new char[5]{ 'N','u','l','l','\0'};
    size = 4;
}
String::String(char* C)
{
    int len = stringLength(C);
    /*str = new char[len];
    for (int i = 0; i < len; i++) {
        str[i] = C[i];
    }
    */
    str = C;
    size = len;
}
String::String(String& S)
{
    str = S.getWord();
    size = S.Size();
}
String::~String()
{
    delete str;
}
int String::Size()
{
    return size;
}
char* String::getWord()
{
    return str;
    //return this->str;
}
class webLinks {
        friend ostream& operator << (ostream& S, webLinks& s);
    protected:
        String* URL;
        int numLinks;
        webLinks** hyperLinks;
        int id = 0;
    public:
        webLinks();
        webLinks(String& x, int n);
        webLinks(webLinks& WL);
        webLinks(webLinks* WL);
        ~webLinks();
        webLinks& operator= (webLinks& WL);
        webLinks* operator= (webLinks* WL);
        webLinks** getHyperlinks();
        String* getURL();
        int getID();
        void setURL(String* S);
        void setURL(char* C);
        void setID(int id);
        void addNeighbor(webLinks& link, int j);
        void setNeighbors(int neighbors);
        void displayIncomingLinks(int numOfLinks);
    };
webLinks::webLinks()
{
    URL = new String();
    numLinks = 0;
    hyperLinks = new webLinks * [0];
}
webLinks::webLinks(String &x, int n)
{
    URL = new String(x);
    numLinks = n;
    hyperLinks = new webLinks * [n];
}
webLinks::webLinks(webLinks& WL)
{
    URL = WL.getURL();
    numLinks = WL.numLinks;
    hyperLinks = WL.getHyperlinks();
}
webLinks::webLinks(webLinks* WL)//int numSites)
{   
    //for (int i = 0; i < numSites; i++) {
        URL = WL->getURL();
        numLinks = WL->numLinks;
        hyperLinks = WL->getHyperlinks();
    //}
}
webLinks::~webLinks()
{
    delete URL;
    delete hyperLinks;
}
webLinks* webLinks::operator=(webLinks *WL)
{
    // TODO: insert return statement here
    //URL = WL.URL;//.getURL());
    //URL = new String(URL->getWord());
    URL = new String(WL->URL->getWord());
    numLinks = WL->numLinks;
    hyperLinks = WL->getHyperlinks();
    return WL;
}
webLinks& webLinks::operator=(webLinks &WL)
{
    // TODO: insert return statement here
    //URL = WL.URL;//.getURL());
    //URL = new String(URL->getWord());
    URL = new String(WL.URL->getWord());
    numLinks = WL.numLinks;
    hyperLinks = WL.getHyperlinks();
    return WL;
}
webLinks** webLinks::getHyperlinks()
{
    return hyperLinks;
}
String* webLinks::getURL()
{
    return URL;
}
void webLinks::setURL(String* S)
{
    URL = new String(S->getWord());
}
void webLinks::setURL(char* C)
{
    URL = new String(C);
}
void webLinks::setID(int ID)
{
    this->id = ID;
}
int webLinks::getID()
{
     return id;
}
void webLinks::addNeighbor(webLinks& link, int j)
{
    hyperLinks[j] = &link;
}
void webLinks::setNeighbors(int numNeighbors)
{
    hyperLinks = new webLinks*[numNeighbors];
}
void webLinks::displayIncomingLinks(int numOfLinks)
{
    int count = 0;
    for (int i = 0; i < 4; i++) {
        cout << hyperLinks[i]->id << endl;
    }
    cout << "\n~~~~~Webpages contained as hyperLinks: \n" << endl;
    for (int i = 0; i < numOfLinks; i++) {
        for (int j = 0; j < hyperLinks[i]->numLinks; j++) {
            if (hyperLinks[j]->id == hyperLinks[i]->id)
                count++;
        }
    }
    cout << URL->getWord() << ": " << count << endl;
    for (int i = 0; i < numLinks; i++) {
        for (int j = 0; j < hyperLinks[i]->numLinks; j++) {
            if (hyperLinks[i]->getURL() == URL)
                cout << "** " << hyperLinks[i]->getURL();
        }
    }
}
int main()
{
    std::cout << "Hello World!\n";
    int numSites;
    int siteNo;
    int numNeighbors = 0;
    int neighbor = 0;
    char* token;
    cin >> numSites;
    cout << "Number of Sites: " << numSites << endl;
    webLinks* myWeb = new webLinks[numSites]();
    for (int i = 0; i < numSites; i++) {
        //read the URL and put it is myWeb[i].setURL (....);
        token = getNextToken();
        /*for (int i = 0; i < 25; i++)
            cout << token[i];
        cout << ": stored. " << endl;*/
        myWeb[i].setURL(token);
        //myWeb[i] = *new webLinks(*new String(token), numSites); //Change: myWeb[i] = new webLinks(new String(token), numSites);
    }
    for (int i = 0; i < numSites; i++) {
        cin >> siteNo >> numNeighbors;
        myWeb[siteNo].setNeighbors(numNeighbors);
        myWeb[siteNo].setID(i);
        for (int j = 0; j < numNeighbors; j++) {
            cin >> neighbor;
            myWeb[siteNo].addNeighbor((myWeb[neighbor]), j); // change: myWeb[siteNo].addNeighbor(&(myWeb[neighbor]), j);
        }
    }
    webLinks* newWeb = new webLinks(myWeb);
    //webLinks* newWeb = new webLinks[numSites](); // using copy constructor
    //for (int j = 0; j < numSites; j++ ) {
    //  newWeb[j] = myWeb[j];
    //}
    newWeb[0].setURL(new char[6]{ 'E','m','p','t','y','\0'});
    // call the overloaded << operator using the newWeb object.
    /*for (int j = 0; j < numSites; j += 3 ) {
        cout << *newWeb[j].getURL() << " " << *newWeb[j+1].getURL() 
            << " " << *newWeb[j+2].getURL() << " " << endl;
    }*/
    
    /*for (int j = 0; j < numSites; j++ ) {
        cout << newWeb[j].getURL() << " : " << *newWeb[j].getURL() << endl;
    }*/
    webLinks* newNewWeb = newWeb; // using overloaded = operator
    // call the displayIncomingLinks() method using the newNewWeb object.
    newNewWeb->displayIncomingLinks(numSites);
    cout << "Done" << endl;
    return 0;
}
