473,699 Members | 2,127 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Access variable in "main.cpp" from other classes

93 New Member
Hey, How do you access a variable in main.cpp from a class?

So if I want to get access to "board" how would I do so?

Expand|Select|Wrap|Line Numbers
  1.  
  2. main.cpp:
  3.  
  4. Boxes board[10];
  5.  
  6. Boxes.h: 
  7.  
  8. void displayBox(int instance);
  9.  
  10. Boxes.cpp:
  11.  
  12. void displayBox(int instance)
  13. {
  14.     glBegin(GL_POLYGON);
  15.         glColor3f(board[instance].color[0], board[instance].color[1], board[instance].color[2]); glVertex2i((int) Boxes::space + (board[instance].xPosition * (Boxes::bSize + Boxes::space)),                (int) Boxes::space + (board[instance].yPosition * (Boxes::bSize + Boxes::space)));
  16.         glColor3f(board[instance].color[0], board[instance].color[1], board[instance].color[2]); glVertex2i((int) Boxes::space + (board[instance].xPosition * (Boxes::bSize + Boxes::space)) + Boxes::bSize, (int) Boxes::space + (board[instance].yPosition * (Boxes::bSize + Boxes::space)));
  17.         glColor3f(board[instance].color[0], board[instance].color[1], board[instance].color[2]); glVertex2i((int) Boxes::space + (board[instance].xPosition * (Boxes::bSize + Boxes::space)) + Boxes::bSize, (int) Boxes::space + (board[instance].yPosition * (Boxes::bSize + Boxes::space)) + Boxes::bSize);
  18.         glColor3f(board[instance].color[0], board[instance].color[1], board[instance].color[2]); glVertex2i((int) Boxes::space + (board[instance].xPosition * (Boxes::bSize + Boxes::space)),                (int) Boxes::space + (board[instance].yPosition * (Boxes::bSize + Boxes::space)) + Boxes::bSize);
  19.     glEnd();
  20. }
  21.  
  22.  
Aug 31 '16 #1
5 1405
weaknessforcats
9,208 Recognized Expert Moderator Expert
I may not have this right but it looks like color is a property of Boxes. So I added a color property. See boxes.h below.

This is the main();

Expand|Select|Wrap|Line Numbers
  1. #define  _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. using namespace std;
  5.  
  6.  
  7.  
  8. //main.cpp:
  9.  
  10. #include "Boxes.h"
  11. #include "func.h"
  12.  
  13. int main()
  14. {
  15.  
  16.     Boxes board[10];
  17.  
  18.     DisplayBox(board[3]);
  19.  
  20. }
  21.  
The compiler will need to know about Boxes and the DisplayBox function. So there is a Boxes.h and a func.h.

Expand|Select|Wrap|Line Numbers
  1. // Boxes.h
  2. #ifndef BOXES
  3. #define BOXES
  4. class Boxes
  5. {
  6.     int color;
  7. public:
  8.  
  9.     void SetColor(int arg) { this->color = arg; }
  10.     int  GetColor() { return this->color; }
  11.  
  12.  
  13.  
  14. };
  15. #endif
  16.  
  17. //func.h
  18.  
  19. #ifndef FUNCH
  20. #define FUNCH
  21.  
  22. #include "Boxes.h"
  23. void DisplayBox(Boxes& arg);
  24.  
  25. #endif
  26.  
Finally the functions are in their own file but here the compiler needs to know about Boxes:


Expand|Select|Wrap|Line Numbers
  1. // func.cpp
  2. #include <iostream>
  3. using namespace std;
  4.  
  5. #include "Boxes.h"
  6.  
  7. void DisplayBox(Boxes& arg)
  8. {
  9.     cout << arg.GetColor();
  10. }

Is this what you had in mind?
Sep 1 '16 #2
Oralloy
988 Recognized Expert Contributor
You can just write this into boxes.cpp
Expand|Select|Wrap|Line Numbers
  1. extern Boxes board[10];
Sep 2 '16 #3
Xillez
93 New Member
Didn't work Oralloy.

Sorry, I forgot to add "float color[3] = {1.0f, 1.0f, 1.0f};" to Boxes.h. I just moved the functions I needed "board[]" in to the "main.cpp" file. Here is my entire code with a separate problem...

In this project I make a window with some squares. When you click on one of these squares it should toggle it's color. BUT for some reason it wont change color, but it registered and found out that I clicked on it...

My guess is that it's an instance flaw or "color[3]" (in Boxes.h) is a global value, which it shouldn't be because it isn't static.

What is causing this flaw?

main.cpp:
Expand|Select|Wrap|Line Numbers
  1. #include <windows.h>
  2. #include <gl/gl.h>
  3. #include "Boxes.h"
  4.  
  5. LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
  6. void EnableOpenGL(HWND hwnd, HDC*, HGLRC*);
  7. void DisableOpenGL(HWND, HDC, HGLRC);
  8.  
  9. const int wWidth = 1080 + Boxes::space;
  10. const int wHeight = 724 + Boxes::space;
  11. const int nrBoxX = 2; //max = 45
  12. const int nrBoxY = 2; //max = 30
  13. const int nrBoxT = 4; //max = 1350
  14. Boxes board[4];
  15. POINT mousePt;
  16. int mouseX = 0;
  17. int mouseY = 0;
  18. bool isBoxesSetup = false;
  19.  
  20. void setupBox()
  21. {
  22.     int a = 0;
  23.     for (int y = 0; y < nrBoxY; y++)
  24.     {
  25.         for (int x = 0; x < nrBoxX; x++)
  26.         {
  27.             board[a].xPosition = x;
  28.             board[a].yPosition = y;
  29.             a++;
  30.         }
  31.     }
  32.     isBoxesSetup = true;
  33. }
  34.  
  35. void displayBox(int instance)
  36. {
  37.     glBegin(GL_POLYGON);
  38.         glColor3f(board[instance].color[0], board[instance].color[1], board[instance].color[2]); glVertex2i((int) Boxes::space + (board[instance].xPosition * (Boxes::bSize + Boxes::space)),                (int) Boxes::space + (board[instance].yPosition * (Boxes::bSize + Boxes::space)));
  39.         glColor3f(board[instance].color[0], board[instance].color[1], board[instance].color[2]); glVertex2i((int) Boxes::space + (board[instance].xPosition * (Boxes::bSize + Boxes::space)) + Boxes::bSize, (int) Boxes::space + (board[instance].yPosition * (Boxes::bSize + Boxes::space)));
  40.         glColor3f(board[instance].color[0], board[instance].color[1], board[instance].color[2]); glVertex2i((int) Boxes::space + (board[instance].xPosition * (Boxes::bSize + Boxes::space)) + Boxes::bSize, (int) Boxes::space + (board[instance].yPosition * (Boxes::bSize + Boxes::space)) + Boxes::bSize);
  41.         glColor3f(board[instance].color[0], board[instance].color[1], board[instance].color[2]); glVertex2i((int) Boxes::space + (board[instance].xPosition * (Boxes::bSize + Boxes::space)),                (int) Boxes::space + (board[instance].yPosition * (Boxes::bSize + Boxes::space)) + Boxes::bSize);
  42.     glEnd();
  43. }
  44.  
  45. int WINAPI WinMain(HINSTANCE hInstance,
  46.                    HINSTANCE hPrevInstance,
  47.                    LPSTR lpCmdLine,
  48.                    int nCmdShow)
  49. {
  50.     WNDCLASSEX wcex;
  51.     HWND hwnd;
  52.     HDC hDC;
  53.     HGLRC hRC;
  54.     MSG msg;
  55.     BOOL bQuit = FALSE;
  56.  
  57.     /* register main window class */
  58.     wcex.cbSize = sizeof(WNDCLASSEX);
  59.     wcex.style = CS_OWNDC;
  60.     wcex.lpfnWndProc = WindowProc;
  61.     wcex.cbClsExtra = 0;
  62.     wcex.cbWndExtra = 0;
  63.     wcex.hInstance = hInstance;
  64.     wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  65.     wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  66.     wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
  67.     wcex.lpszMenuName = NULL;
  68.     wcex.lpszClassName = "All White";
  69.     wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  70.  
  71.  
  72.     if (!RegisterClassEx(&wcex))
  73.         return 0;
  74.  
  75.     /* create main window */
  76.     hwnd = CreateWindowEx(0,
  77.                           "All White",
  78.                           "All White",
  79.                           WS_OVERLAPPEDWINDOW,
  80.                           CW_USEDEFAULT,
  81.                           CW_USEDEFAULT,
  82.                           wWidth,
  83.                           wHeight,
  84.                           NULL,
  85.                           NULL,
  86.                           hInstance,
  87.                           NULL);
  88.  
  89.     ShowWindow(hwnd, nCmdShow);
  90.  
  91.     /* enable OpenGL for the window */
  92.     EnableOpenGL(hwnd, &hDC, &hRC);
  93.  
  94.     /* program main loop */
  95.     while (!bQuit)
  96.     {
  97.         /* check for messages */
  98.         if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  99.         {
  100.             /* handle or dispatch messages */
  101.             if (msg.message == WM_QUIT)
  102.             {
  103.                 bQuit = TRUE;
  104.             }
  105.             else
  106.             {
  107.                 TranslateMessage(&msg);
  108.                 DispatchMessage(&msg);
  109.             }
  110.         }
  111.         else
  112.         {
  113.             /* OpenGL animation code goes here */
  114.  
  115.             glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
  116.             glClear(GL_COLOR_BUFFER_BIT);
  117.  
  118.             glPushMatrix();
  119.  
  120.             glOrtho(0, wWidth, wHeight, 0, -1, 1);
  121.  
  122.             if (!isBoxesSetup) setupBox();
  123.  
  124.             for (int a = 0; a < nrBoxT; a++)
  125.             {
  126.                 displayBox(a);
  127.             }
  128.  
  129.             glPopMatrix();
  130.  
  131.             SwapBuffers(hDC);
  132.         }
  133.     }
  134.  
  135.     /* shutdown OpenGL */
  136.     DisableOpenGL(hwnd, hDC, hRC);
  137.  
  138.     /* destroy the window explicitly */
  139.     DestroyWindow(hwnd);
  140.  
  141.     return msg.wParam;
  142. }
  143.  
  144. LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  145. {
  146.     switch (uMsg)
  147.     {
  148.         case WM_CLOSE:
  149.             PostQuitMessage(0);
  150.         break;
  151.  
  152.         case WM_DESTROY:
  153.             return 0;
  154.         break;
  155.  
  156.         case WM_LBUTTONDOWN:
  157.             GetCursorPos(&mousePt);
  158.             ScreenToClient(hwnd, &mousePt);
  159.             mouseX = mousePt.x;
  160.             mouseY = mousePt.y;
  161.             for (int i = 0; i < nrBoxT; i++)
  162.             {
  163.                 bool buttonPressed = board[i].checkIfPressed(mouseX, mouseY);
  164.                 if (board[i].checkIfPressed(mouseX, mouseY))
  165.                 {
  166.                     board[i].toggleColorState(i);
  167.                 }
  168.             }
  169.         break;
  170.  
  171.         case WM_KEYDOWN:
  172.         {
  173.             switch (wParam)
  174.             {
  175.                 case VK_ESCAPE:
  176.                     PostQuitMessage(0);
  177.                 break;
  178.  
  179.                 case VK_SPACE:
  180.                     PostQuitMessage(0);
  181.                 break;
  182.             }
  183.         }
  184.         break;
  185.  
  186.         default:
  187.             return DefWindowProc(hwnd, uMsg, wParam, lParam);
  188.     }
  189.  
  190.     return 0;
  191. }
  192.  
  193. void EnableOpenGL(HWND hwnd, HDC* hDC, HGLRC* hRC)
  194. {
  195.     PIXELFORMATDESCRIPTOR pfd;
  196.  
  197.     int iFormat;
  198.  
  199.     /* get the device context (DC) */
  200.     *hDC = GetDC(hwnd);
  201.  
  202.     /* set the pixel format for the DC */
  203.     ZeroMemory(&pfd, sizeof(pfd));
  204.  
  205.     pfd.nSize = sizeof(pfd);
  206.     pfd.nVersion = 1;
  207.     pfd.dwFlags = PFD_DRAW_TO_WINDOW |
  208.                   PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
  209.     pfd.iPixelType = PFD_TYPE_RGBA;
  210.     pfd.cColorBits = 24;
  211.     pfd.cDepthBits = 16;
  212.     pfd.iLayerType = PFD_MAIN_PLANE;
  213.  
  214.     iFormat = ChoosePixelFormat(*hDC, &pfd);
  215.  
  216.     SetPixelFormat(*hDC, iFormat, &pfd);
  217.  
  218.     /* create and enable the render context (RC) */
  219.     *hRC = wglCreateContext(*hDC);
  220.  
  221.     wglMakeCurrent(*hDC, *hRC);
  222. }
  223.  
  224. void DisableOpenGL (HWND hwnd, HDC hDC, HGLRC hRC)
  225. {
  226.     wglMakeCurrent(NULL, NULL);
  227.     wglDeleteContext(hRC);
  228.     ReleaseDC(hwnd, hDC);
  229. }
  230.  
Boxes.h:
Expand|Select|Wrap|Line Numbers
  1. #ifndef BOXES_H
  2. #define BOXES_H
  3.  
  4. class Boxes
  5. {
  6.     public:
  7.         float color[3] = {1.0f, 1.0f, 1.0f};
  8.         const static int space = 4;
  9.         const static int bSize = 20;
  10.         int xPosition = 0;
  11.         int yPosition = 0;
  12.         int realMinX = (int) space + (xPosition * (bSize + space));
  13.         int realMaxX = (int) space + (xPosition * (bSize + space)) + bSize;
  14.         int realMinY = (int) space + (yPosition * (bSize + space));
  15.         int realMaxY = (int) space + (yPosition * (bSize + space)) + bSize;
  16.         int cState = 3;
  17.         int nState = 0;
  18.  
  19.         Box(int xPos, int yPos);
  20.         float getColor();
  21.         void setColor(float red, float green, float blue);
  22.         void toggleColorState(int i);
  23.         bool checkIfPressed(int x, int y);
  24.  
  25.     protected:
  26.  
  27.     private:
  28.  
  29. };
  30.  
  31. #endif // BOXES_H
  32.  
  33.  
Boxes.cpp:
Expand|Select|Wrap|Line Numbers
  1. #include "Boxes.h"
  2. #include <windows.h>
  3. #include <gl/gl.h>
  4.  
  5. extern Boxes board[4];
  6.  
  7. Boxes::Box(int xPos, int yPos)
  8. {
  9.     xPosition = xPos;
  10.     yPosition = yPos;
  11. }
  12.  
  13. void Boxes::toggleColorState(int i)
  14. {
  15.     cState = nState;
  16.     nState++;
  17.     if (nState > 3) nState = 0;
  18.  
  19.     if (cState == 0)
  20.     {
  21.         board[i].color[0] = 1.0f;
  22.         board[i].color[1] = 0.0f;
  23.         board[i].color[2] = 0.0f;
  24.     }
  25.     if (cState == 1)
  26.     {
  27.         board[i].color[0] = 0.0f;
  28.         board[i].color[1] = 1.0f;
  29.         board[i].color[2] = 0.0f;
  30.     }
  31.     if (cState == 2)
  32.     {
  33.         board[i].color[0] = 0.0f;
  34.         board[i].color[1] = 0.0f;
  35.         board[i].color[2] = 1.0f;
  36.     }
  37.     if (cState == 3)
  38.     {
  39.         board[i].color[0] = 1.0f;
  40.         board[i].color[1] = 1.0f;
  41.         board[i].color[2] = 1.0f;
  42.     }
  43. }
  44.  
  45. //Not used
  46. float Boxes::getColor()
  47. {
  48.     return *color;
  49. }
  50.  
  51. //Not used
  52. void Boxes::setColor(float red, float green, float blue)
  53. {
  54.     color[0] = red;
  55.     color[1] = green;
  56.     color[2] = blue;
  57. }
  58.  
  59. bool Boxes::checkIfPressed(int x, int y)
  60. {
  61.     if (x > realMinX && x < realMaxX && y > realMinY && y < realMaxY) return true;
  62.     return false;
  63. }
  64.  
  65.  
Sep 2 '16 #4
weaknessforcats
9,208 Recognized Expert Moderator Expert
You cannot put any code in a header file that creates variables or that is code for the body of a function. Every time the .h is included by the various .cpp files you get another set of variables. Then your build dies in the link with redefinition errors.

Instead use a #define in your include:

Expand|Select|Wrap|Line Numbers
  1. #define RED 1.0
  2. #define BLUE  2.0
  3.  
There should never be any hard-coded symbolic constants in your code. A symbolic constant is like 4 or 25.2, etc...

What is this?????

Expand|Select|Wrap|Line Numbers
  1. void Boxes::toggleColorState(int i)
  2. 14. {
  3. 15.     cState = nState;
  4. 16.     nState++;
  5. 17.     if (nState > 3) nState = 0;
  6. 18. 
  7. 19.     if (cState == 0)
  8. 20.     {
  9. 21.         board[i].color[0] = 1.0f;
  10. 22.         board[i].color[1] = 0.0f;
  11. 23.         board[i].color[2] = 0.0f;
  12. 24.     }
  13.  
This is class member function. There is no board variable possible. board is an array in main(). There is no variable i The code I sent you uses board only in main().

Also, your class should have no public data members. This is not a C struct but a C++ class. Any color values should be defined in the header file as above, or you will need a Color class that has a private obj in Boxes.

Remember, all the processing is in main(). All the class member functions do is manage the private data members of the class.

It looks like you are merging the application code with the class code and this will never work.

Expand|Select|Wrap|Line Numbers
  1. main.cpp:
  2.  
  3. Boxes board[10];
  4.  
  5.       board[1].setColor(etc...};
This code changes the Boxes object board[1]. Inside the member function all you have is the address of the board object which is calling the member function. Read up on the this pointer.

keep posting . We have all gone through this.
Sep 3 '16 #5
donbock
2,426 Recognized Expert Top Contributor
It isn't that you can't put variable or function definitions in a header file -- it's that it is almost always a mistake to do so. Sometimes doing so triggers a build error, other times it may yield a possibly intermittent run-time bug.

Typically, you put a variable or function definition in one .c/.cpp file and the corresponding declaration in a header file that is included by all .c/.cpp files that define or refer to that variable or function.
Sep 7 '16 #6

Sign in to post your reply or Sign up for a free account.

Similar topics

2
1998
by: Hal Vaughan | last post by:
If I have a class like this: public class Tester { ObjectType1 ot1; ObjectType2 ot2; ObjectType3 ot3; public void main(String args) { //Preliminary checking, resulting in bRun being
0
1121
by: dberlin | last post by:
hey, My situation is like this- whenever I create an application with a gui I put the gui source in one file that calls all the other classes (from imported modules). This creates a problem when needing to print something out on a gui control or something similar. It is then needed to send the called class the control object and the class will then modify it on its part. This makes the classes I create not very generic, and just gives me...
2
2594
by: diadia | last post by:
when i write two classes as follow . compiler tell me that i can't access private number from other class but if types of two classes are the same it don't have error message ? why? class schema { private:
3
1447
by: Barbara | last post by:
Is it possible in C# to merge two strings to access variable? (Like in JScript: document('variable'+200).style...) What I am trying to do is: I have a class Structure.cs I would like to create several Structure-s, fill their elements with data, but in a way that I can choose starting number (sometimes I need Structure,, sometimes )
4
1415
by: Ian Meakin | last post by:
I have a page called admin.aspx and it uses admin.aspx.cs as it's code behind file. When developing the application on my localhost using VS.NET i reference thsi file using codebehind="admin.aspx.cs". I now have to upload it to a production server which i have no control over and has no bin directory (and i cannot create one) to place the project dll assemblies in to. I have now changed the file to use the src attricbute so the files...
6
1351
by: STom | last post by:
I have a class declare like this: <Serializable>Public Class Talk Public Structure _localTalk Public _iTalkNumber as Integer End structure End Class I can see the structure from other classes, but I cannot see the internal
5
2052
by: Scott Starker | last post by:
Is there anyway to do this? Every time any button is click inside class Form1, MyButtomArray.CharArray (MyButtomArray is a class) gets set (or reset) (bool). Once this is done the class TEC gets executed. I want to access MyButtonArray.CharArray to get the bool values in TEC. Any ideas? Scott
7
1232
by: Guillaume BRAUX | last post by:
Hello, I am looking for a way to create a method that will be available to other classes in my project, but without needing to instanciate the class. I don't want this method to be static (il would be too easy ^^) ! Finally, i'd like to call my method by only doing "methodClass.myClass()" without having to instanciate "methodClass" before (like form1.ActiveForm or Form1.DefaultFont that do not need to instanciate form1 to use them ...).
2
1558
by: Chris Zopers | last post by:
Hello, I have two UserControls on a aspx page. I need to read a property of the first UserControl from within the second UserControl. The UserControls only know about themselves, so I can't declare a variable of the other usercontrol's type. So I can't do something like this in the second UserControl: FirstUserControl first = (FirstUserControl)this.Parent.FindControl("FirstUserControl")
4
2732
by: AlarV | last post by:
I want to create an array of pointers, for my class. Each pointer will in fact be the 'head' of a dynamic list. I don't know the size of the array and it has to be given by the user. So my problem is that in my class I have to read the size in the constructor. In the other functions of the class( e.g. insert etc.) the table has to EXIST. However, when I try to access it from the other functions (e.g. insert) the table isn't NULL. And the...
0
8706
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, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
8630
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
9055
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 tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
8944
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
8899
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
5889
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
4638
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
2
2364
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2016
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

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.